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_VERSINFO
zsh
$ZSH_VERSION
$KSH_VERSION
ksh
${.sh.version}
$YASH_VERSION
yash
Linuxでは、これらのシェルを使用してインタプリタを実行するプロセスのpidで拡張されたreadlink "/proc/$$/exe"
シェルインタプリタへのパスを取得することもできます(Bourne様、csh様、in、in -likeシェルを参照)。$$
$fish_pid
fish
$pid
rc
より便利には、シェルを実行する必要がある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
答え2
シェル変数名は大文字と小文字を区別します。これ合意は環境変数名はすべて大文字です。あなたは入力する必要があります
echo $SHELL
代わりに。 @StephenKittが指摘したように、これは本で実際に言及されたコマンドです。
通常、echo
シェル変数の内容を印刷するために使用されるものは次のとおりです。落胆するprintf
、@ Stéphane Chazelasの答えで指摘されているようです。