2013-06-05 6 views
7

私は、ある時点で/ bin/zshにユーザーのシェルを変更する.shスクリプトをプログラミングしています。コマンドは以下のはもちろんである:現在のユーザーのシェルを特定する

chsh -s /bin/zsh 

しかし、これは、ユーザーのパスワードを要求し、私は現在のユーザのシェルがすでに/bin/zshでない場合にのみ、それを実行したいと思います。このために私は現在のシェルを知っているコマンドを必要とし、それを"/bin/zsh"またはそれと同様に比較します。 Cのgetusershell関数があることがわかりましたが、これをシェルスクリプトから知る方法はありませんか?

更新:申し訳ありませんが、私はユーザーが希望するシェルとして指定したシェルを意味します。はい、/etc/passwdで指定されたものです。この背後にある論理は、スクリプトがユーザーの好みのシェルをzshに変更しようとしていることです。スクリプトがまだzshでない場合は最初にチェックします。

+2

grep/etc/passwdを使用して、ユーザーの「公式」シェルを取得します。そのシェルから実際にこのスクリプトを実行していない可能性があることに注意してください。彼らはよくダッシュを使ってログインし、手動でbashを実行し、kornシェルなどに切り替えることができます。 –

+3

@MarcB Linuxをサポートしている場合は、getent passwdを使用する方が良いでしょう。$ USER " grep '/ etc/passwd'は、nsswitch(LDAP、NISなど)で設定されたwhahteverを検索するので、'/etc/passwd'をgrepするのではなく、 '/ etc/passwd'を使うシステムでのみ機能します。 –

+1

「現在のシェル」とはどういう意味ですか? '/ etc/passwd'または現在実行中のもので現在指定されているものは? – Jens

答えて

14

$SHELLは、現在のユーザのシェルを返します。

$ echo $SHELL 
/bin/zsh 
+0

今、私は '$ SHELL'について以前知らなかったので、馬鹿げた気分になりました。どうもありがとう! – Ernesto

+2

'$ SHELL'は'/etc/passwd'にあるものと全く同じですが、ユーザが別のシェルを起動したりexecしなかったことに注意してください。ログインシェルを見つけるには、 '/ etc/passwd'を見てください。 – Jens

+0

@Jens、弾丸ではない。ユーザーエントリは、NIS、NIS +、LDAPなどの/ etc/passwd以外の場所にある可能性があります。 – jlliagre

2
$ awk -F: '$1 == "myusername" {print $NF}' /etc/passwd 
/bin/zsh 

それとも、あなたはシェル変数varにユーザー名がある場合:

awk -F: -v u=$var '$1 == u {print $NF}' /etc/passwd 

をこれが/etc/passwdを想定(NISが提供されるのとは対照的に、あなたの​​とそれぞれのmanページを参照してください)ローカルで完了です。

+0

これはユーザーの割り当てられたシェルを取得しませんか?質問は、現在の質問をします。 –

+0

"現在のシェル"は '/ etc/passwd'のものを指していると思います。他のシェルを 'chsh 'でzshに変更することは無意味です。実行中のシェルを置き換えることはできません。しかし、はい、質問はあいまいです。 – Jens

+0

はい、申し訳ありませんが、私の質問は十分ではありませんでした。私が「現在のシェル」と言ったとき、私はユーザが現在自分の好みのシェルとして割り当てたシェル、つまりzshに変更するシェルを意味しました。 – Ernesto

2

次のコマンドは、(CMDセルに)あなたの現在のシェルを与える:

ps -p $$ 
+1

これは現在実行中のシェルです。ユーザーのログインシェルであってもなくてもかまいません。 –

0

次作品:

ps p $$ | awk '{print $5}' 

$ SHELLと/ etc/passwdの値が正しくないことがあります。

+0

これは、現在実行中のシェルです。ユーザーのログインシェルであってもなくてもかまいません。どのような意味で '/ etc/passwd'の値が「間違っている」(情報が'/etc/passwd'ファイルから実際に提供されていると仮定して)? –

+0

あなたのデフォルトシェルがbashで、bashから 'zsh'と入力してください。あなたの現在のシェルはもはや '/ etc/passwd'には表示されません。 – cforbish

+0

OPは '/ etc/passwd'(または同等のもの)で指定されているシェルが彼が興味を持っているものであることを明確にしました。 –

4

/etc/passwdは、ユーザーのシェルが格納されている場所であるとは限りません。

私はこの使用します。

getent passwd $(id -un) | awk -F : '{print $NF}' 

編集:それにgetentは唯一のSolaris、BSD系およびGNU/LinuxベースのOSに実装されていますが。

AIX、HP-UXおよびOS Xは、同じようなことを行うために独自の方法を持っている(それぞれlsusers -cpwget -ndscl ...)ので、このコマンドが強化されなければならないこれらのOSがサポートする必要がある必要があります。

+0

悲しいことに、getentはPOSIXではないので、Solaris、BSDまたはLinuxを想定しています。 – Jens

+0

@Jens確かに、それはPOSIXがそのコマンドを見逃したのは残念です。 – jlliagre

0
perl -e '@pw = getpwuid $< ; print $pw[8], "\n"' 

これはPerlが適切に設定、インストールされていることを前提とし、最も近代的なUnixライクなシステムにかなり安全な賭けであるあなたの$PATH、インチ(それはそれgetentが利用可能であるか、そのユーザ情報が実際に/etc/passwdファイルに格納されている、または$SHELLの値が変更されていないことよりも、おそらく安全な賭けだ。)

$<は、現在のプロセスの実UIDです。getpwuid()は、システムが使用する他のどのようなメカニズム(NIS、LDAP)でも、/etc/passwdまたはから値の配列を返します。その配列の要素8は、ユーザーのログインシェルです。上記僅かに短縮することができる

perl -e 'print +(getpwuid $<)[8], "\n"' 

又は

perl -e 'print((getpwuid $<)[8], "\n")' 

単項+オペレータ理由や余分な括弧はかなり不明瞭です。

関連する問題