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


10

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

使用例:コマンドのエイリアスを設定するスクリプトを作成しています。このエイリアスはシェルスクリプト内で設定されます。

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

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

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

シバンセットに関係なく、スクリプトが実行されるシェルタイプを取得する方法はありますか?

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


@StephenRauch先ほど触れたはずですが、MacベースのシステムとLinuxベースのシステムの両方で機能する方法を探しています。Macの/ etc / passwdにはユーザー情報が含まれておらず、シングルユーザーモードでのみ参照されます。
Spaniard89

/etc/passwdOSXには何がありますか?オンラインでざっと見たところ、ユーザー名ではなく、シェルが表示されているようです。ユーザーIDはまだ残っていますが、それを使用しないのはなぜですか。
terdon

シェルの完全なリストを作成することさえ可能だろうか。または、すべてのシェル起動ファイルは常に。{name_of_shell} rcに準拠していますか?
jamesqf 2017年

回答:


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

ありがとうございます。これは、おそらくMacとLinuxベースのビストロの両方で機能する唯一のソリューションです。
Spaniard89

1
ところで、finger $USER | grep 'Shell:*' | cut -f3 -d ":"grepオプション-PはMacではサポートされていないため、コマンドを少し編集して、すべてのOSに依存しないようにしました。
Spaniard89

2
fingerすべてのマシンにインストールされているとは限らないことに注意してください。これは、RedHatベースのシステムのオプションパッケージです。
スティーブンハリス

1
@Kishorepandey:getent|grep ^$USER:|cut -f: -f7fingerがデフォルトでインストールされていない場合、fingerの代わりに使用できます。
Ipor Sircer 2017年

@Kishorepandeyこれを行わないでください。存在するSHELL場合は、環境変数を使用します。ユーザーデータベースを見ると結果(ユーザーのログインシェル)が得られますが、正しい結果(ユーザーのお気に入りの対話型シェル)ではない可能性があります。これはユーザーの構成によって異なります。
Gilles「SO-邪悪なことをやめる」

19

環境変数SHELLは常に、呼び出し元のユーザーのデフォルトのログインシェル展開されます(から値を取得します/etc/passwd)。

他の特定のユーザーの場合は、でいくつかの処理を行う必要があります。以下に/etc/passwd簡単なawkスニペットを示します。

awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd

foobar実際のユーザー名に置き換えます。

あなたが持っている場合ldap(または適切な場所にある場合)、getent直接解析するのではなく、を使用してデータベースを取得します/etc/passwd

getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'

または最もクリーンなアプローチ、getent解析を実行してみましょう(@Kusalanandaに感謝):

getent passwd foobar | awk -F: '{print $NF}'

3
getent passwd foobar特定の行との一致をスキップします。
クサラナンダ

答えてくれてありがとう。私は以前にそれを述べたはずですが、MacとLinuxベースのシステムの両方で機能する方法を探しています。Macの/ etc / passwdにはユーザー情報が含まれておらず、シングルユーザーモードでのみ参照されます。
Spaniard89

4

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

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

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

2

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

echo $SHELL

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

echo $0

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



0

多分これ:

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

これは、すでに与えられた答えのどれも改善しません。
クサラナンダ

作品が共通しているユーザーが複数いる場合、これは機能しません。例えばあればUSER=fred、これは一致しますfredfrederickalfredalfredo...
スティーブン・ハリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.