シェルスクリプト内で現在のユーザーのデフォルトシェルを見つける方法があるかどうか疑問に思っていましたか?
使用例:コマンドのエイリアスを設定するスクリプトに取り組んでおり、このエイリアスはシェルスクリプト内で設定されます。
!# /bin/bash
alias = 'some command to set the alias'
スクリプトにロジックがあり、スクリプトを実行するユーザーのデフォルトのシェルを見つけて、このエイリアスをそれぞれの〜/ .bashrcまたは〜/ .zshrcファイルに追加します。
しかし、スクリプトの前にシバンを追加し、bashを使用するように明示的に要求しているため、投稿された回答 here は常に期待どおりにbashを返しますが、ZSH端末でこのスクリプトを実行しています。
Shebangの設定に関係なく、スクリプトが実行されるShellタイプを取得する方法はありますか?
MacとすべてのLinuxベースのビストロの両方で機能するソリューションを探しています。
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
環境変数Shell
は常にデフォルトのログインシェルに展開されます呼び出し元ユーザーの(/etc/passwd
から値を取得します)。
他の特定のユーザーについては、/etc/passwd
を使用していくつかの処理を実行する必要があります。これが単純なawk
スニペットです。
awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd
foobar
を実際のユーザー名に置き換えます。
ldap
(または同じようなもの)がある場合、/etc/passwd
を直接解析する代わりに、getent
を使用してデータベースを取得します。
getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'
または最もクリーンなアプローチ、getent
に解析を実行させます(@Kusalanandaに感謝):
getent passwd foobar | awk -F: '{print $NF}'
getent
はMacOSの標準コマンドではないため、マシンが構成されているネーミングサービスを参照する、より低いレベルのgetpwuid
呼び出しを使用できます。これには、Perl
またはpython
の呼び出しが必要になる場合があります。これらは、ほとんどのUnixライクなプラットフォームでかなり一般的です
たとえば、これは現在のユーザーのシェルを返します。
Perl -e '@x=getpwuid($<); print $x[8]'
次のような環境からユーザーのデフォルトのシェルを取得できます。
echo $Shell
しかし、これは好きではありません:
echo $0
後者は、スクリプトが現在使用しているシェルを通知するだけです。したがって、上記の最初のオプションが必要です。
多分これ:
grep $USER </etc/passwd | cut -f 7 -d ":"
短くて無痛:
getent passwd <USER> | cut -d : -f 7