シェルスクリプトでユーザーのデフォルトシェルを見つける

シェルスクリプトでユーザーのデフォルトシェルを見つける

シェルスクリプトで現在のユーザーのデフォルトシェルを見つける方法があるかどうか疑問に思います。

ユースケース:コマンドのエイリアスを設定するスクリプトを作成しており、エイリアスはシェルスクリプトに設定されています。

!# /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実際のユーザー名に置き換えます。

ldap1つ(または同様のもの)がある場合は、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呼び出しが必要になることがあります。perlpython

たとえば、現在のユーザーのシェルが返されます。

perl -e '@x=getpwuid($<); print $x[8]'

答え4

次のように、環境からユーザーのデフォルトシェルをインポートできます。

echo $SHELL

しかし、これはありません:

echo $0

後者は、スクリプトが現在どのシェルを使用しているかを教えてくれます。したがって、上記の最初のオプションが必要です。

関連情報