シェルスクリプトで現在のユーザーのデフォルトシェルを見つける方法があるかどうか疑問に思います。
ユースケース:コマンドのエイリアスを設定するスクリプトを作成しており、エイリアスはシェルスクリプトに設定されています。
!# /bin/bash
alias = 'some command to set the alias'
スクリプトを実行しているユーザーの既定のシェルを探し、対応する ~/.bashrc または ~/.zshrc ファイルにこのエイリアスを追加するロジックがスクリプトにあります。
しかし、スクリプトの前にshebangを追加し、明示的にbashを使用するように要求すると、答えが投稿されました。ここZSH端末でこのスクリプトを実行しても、常に期待どおりにbashが返されます。
shebang設定に関係なく、スクリプトを実行するシェルタイプを取得する方法はありますか?
私はMacとすべてのLinuxベースのビストロで動作するソリューションを探しています。
答え1
環境変数はSHELL
常にデフォルトのログインシェルに展開されます。ユーザーに電話する(から値を取得します/etc/passwd
)。
他の特定のユーザーの場合は、いくつかの処理を実行する必要があります/etc/passwd
。以下は簡単なawk
スニペットです。
awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd
foobar
実際のユーザー名に置き換えます。
ldap
1つ(または同様のもの)がある場合は、getent
直接解析する代わりにデータベースインポートを使用してください/etc/passwd
。
getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'
または、最もきちんとした方法で解析してみましょうgetent
(@Kusalanandaに感謝します)。
getent passwd foobar | awk -F: '{print $NF}'
答え2
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
答え3
これはMacOSの標準コマンドではないため、低レベルの呼び出しを使用してコンピュータに設定されているネーミングサービスを照会getent
できます。これを行うには、ほとんどのUnixファミリープラットフォームで一般的に発生するかgetpwuid
呼び出しが必要になることがあります。perl
python
たとえば、現在のユーザーのシェルが返されます。
perl -e '@x=getpwuid($<); print $x[8]'
答え4
次のように、環境からユーザーのデフォルトシェルをインポートできます。
echo $SHELL
しかし、これはありません:
echo $0
後者は、スクリプトが現在どのシェルを使用しているかを教えてくれます。したがって、上記の最初のオプションが必要です。