echo $-
コマンドを使用してコンソール設定を出力すると、デフォルトでhimBHs
が出力されます。ただし、同じコマンドをスクリプトファイルで実行すると、hB
のみが出力されます。
root@root:~# echo $-
himBHs
root@root:~# ./abc.sh
hB
root@root:~#
/bin/bash
環境からスクリプトを実行しているのに、なぜ同じデフォルト設定が適用されないのでしょうか。
たとえば、コマンド/bin/bash
コンソール上を使用して新しいサブシェルプロセスを開始し、設定を一覧表示すると、出力himBHs
が表示されます。
root@root:~# /bin/bash
root@root:~# echo $-
himBHs
シェルファイル内から同じプロセスを実行しようとすると、出力は "hB"になります。
root@root:~# ./abc.sh
hB
Shebangを使用する場合と使用しない場合とで同じプロセスを試しましたが、スクリプトファイルはbash script_file
または./script_file
のいずれかです。実行すると、同じ結果が得られます(hB
)。
正確には何が欠けていますか?
スクリプトを実行すると、親シェル(コマンドを実行するシェル)が非インタラクティブシェルを起動して、インタラクティブフラグが無効i
のスクリプトを実行し、2つのオプションのみをオンにするため
-h
は、実行のために検索されるときにコマンドを見つけて記憶(ハッシュ)します。-B
は、シェルがブレース展開を実行できるようにします$-
の出力に表示されるset
オプションの完全なリストを確認できます- Set Setin
インタラクティブシェルで使用可能なその他のオプション、-i
は、シェルをインタラクティブモードで実行することを示します。
-m
はジョブ制御を許可します-H
!
スタイルの履歴置換を有効にしますBashがインタラクティブに実行されているか、POSIXモードで実行されているかなどに応じて、デフォルトでいくつかの設定が有効(または無効)になっています。たとえば、help set
の出力から:
-H Enable ! style history substitution. This flag is on
by default when the Shell is interactive.
または:
-p Turned on whenever the real and effective user ids do not match.
たまたま、インタラクティブで非POSIXモードのBashの場合、有効なオプションはhimBHs
です(-i
はインタラクティブモード用、-s
は標準入力からコマンドを読み取るためのものです。他のオプションはhelp set
)にリストされています。