web-dev-qa-db-ja.com

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

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

使用例:コマンドのエイリアスを設定するスクリプトに取り組んでおり、このエイリアスはシェルスクリプト内で設定されます。

!# /bin/bash
alias = 'some command to set the alias'

スクリプトにロジックがあり、スクリプトを実行するユーザーのデフォルトのシェルを見つけて、このエイリアスをそれぞれの〜/ .bashrcまたは〜/ .zshrcファイルに追加します。

しかし、スクリプトの前にシバンを追加し、bashを使用するように明示的に要求しているため、投稿された回答 here は常に期待どおりにbashを返しますが、ZSH端末でこのスクリプトを実行しています。

Shebangの設定に関係なく、スクリプトが実行されるShellタイプを取得する方法はありますか?

MacとすべてのLinuxベースのビストロの両方で機能するソリューションを探しています。

10
Spaniard89
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
6
Ipor Sircer

環境変数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}'
18
heemayl

getentはMacOSの標準コマンドではないため、マシンが構成されているネーミングサービスを参照する、より低いレベルのgetpwuid呼び出しを使用できます。これには、Perlまたはpythonの呼び出しが必要になる場合があります。これらは、ほとんどのUnixライクなプラットフォームでかなり一般的です

たとえば、これは現在のユーザーのシェルを返します。

Perl -e '@x=getpwuid($<); print $x[8]'
4
Stephen Harris

次のような環境からユーザーのデフォルトのシェルを取得できます。

echo $Shell

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

echo $0

後者は、スクリプトが現在使用しているシェルを通知するだけです。したがって、上記の最初のオプションが必要です。

2
Alxs

多分これ:

   grep $USER </etc/passwd | cut -f 7 -d ":"
0
user226946

短くて無痛:

getent passwd <USER> | cut -d : -f 7
0
David Foerster