web-dev-qa-db-ja.com

`set`のbashオプションのリストについて

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)。

正確には何が欠けていますか?

1
testter

スクリプトを実行すると、親シェル(コマンドを実行するシェル)が非インタラクティブシェルを起動して、インタラクティブフラグが無効iのスクリプトを実行し、2つのオプションのみをオンにするため

  • -hは、実行のために検索されるときにコマンドを見つけて記憶(ハッシュ)します。
  • -Bは、シェルがブレース展開を実行できるようにします

$-の出力に表示されるsetオプションの完全なリストを確認できます- Set Setin

インタラクティブシェルで使用可能なその他のオプション、-iは、シェルをインタラクティブモードで実行することを示します。

  • -mはジョブ制御を許可します
  • -H!スタイルの履歴置換を有効にします
2
Inian

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)にリストされています。

1
muru