echo $shell 出力が空白なのはなぜですか?

echo $shell 出力が空白なのはなぜですか?

Daniel J. BarrettのO'Reilly Linuxポケットガイドによると、このコマンドはecho $shell現在使用されているシェルを印刷する必要があります。

端末でコマンドを実行すると、空行が表示されます。私が理解しているように、端末が開いているとシェルが実行されている必要がありますが、なぜ空白が印刷されるのか混乱しています。

raven# echo $shell

raven#

ベストアンサー1

csh/シェルのみ変数をtcsh設定します。$shellしたがって、これらのシェルのいずれかで実行している場合にのみ、このコマンドを使用してシェルへのパスを取得できます。echo $shellおそらく、これらのことが議論されているその本のセクションにあります。

loginまたはその他のログインマネージャの設定SHELL 環境passwd変数をログインシェル(アカウントデータベースに記載されているシェル)に追加すると、これらのシェルは常にその変数にマップされます。これは、ターミナル$SHELLエミュレータまたは起動用のデフォルトシェルに設定したい環境変数です。viログインではありません。シェル。

しかし、必ずしも皮である必要はありません。現在使用中

$SHELLログインしてからこの変数が変更されていない環境でターミナルエミュレータを起動し、ターミナルエミュレータが(または他のコマンド)に保存されているものとは異なるシェル(または他のコマンド)を起動するように設定されていない場合、それから$SHELL他のシェルは起動されませんでした。または$SHELLシェルの起動順序で変数が変更されていない場合、これが発生します。$SHELL

シェルに関係なく、どのシェルを使用しているかを示すシェル変数はありません。しかし、 ksh93 の一部の実装には (t)csh の他に ' または / ' があり、どのシェルが何なのかを知ることができます$shell。ランニング。bash$BASH$BASH_VERSION$BASH_VERSINFOzsh$ZSH_VERSION$KSH_VERSIONksh${.sh.version}$YASH_VERSIONyash

Linuxでは、これらのシェルを使用してインタプリタを実行するプロセスのpidで拡張されたreadlink "/proc/$$/exe"シェルインタプリタへのパスを取得することもできます(Bourne様、csh様、in、in -likeシェルを参照)。$$$fish_pidfish$pidrc

より便利には、シェルを実行する必要があるsh -c 'ps -o comm= -p "$PPID"'親プロセスの名前が提供されます。sh現在使用中、プロセス名は、シェルインタプリタ実行可能ファイルのデフォルト名から派生する必要があります。すべての汎用シェルはこのコードを同じ方法で解釈する必要があり、このサイトの範囲内のすべてのシステムにはshこのコードを理解するコマンドが必要です。ps

Bourneなどのシェルから変数の内容と改行文字を印刷するには、構文は次のとおりです。

printf '%s\n' "$SHELL"

またはcsh:

printf '%s\n' $SHELL:q

またはrc-likeまたはfishまたはzshシェルから:

printf '%s\n' $SHELL

いいえecho $SHELL(どのシェルが実行されているのかわからない場合は、おそらく十分な近似であり、ほとんどの場合、ほとんどのシェルで機能します)。

passwdログインシェル(データベースに保存されている)が何であるかを確認するには、多くのシステムで次のことができます(Bourne構文)。

getent -- passwd "$LOGNAME" | cut -d: -f7

またはユーティリティがないシステムではgetent

perl -le 'print((getpwnam getlogin)[8])'

¹ ただし、ワイルドカードが含まれていない場合にのみ該当し、任意のデータを出力する$shellために壊れることがあります。echo

おすすめ記事