`set`にbashオプションをリストする情報

`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_filehB

私は何を見逃していますか?

答え1

スクリプトを実行すると、親シェル(コマンドを実行するシェル)はスクリプトを実行するために非対話型シェルを起動します。このシェルでは対話型フラグが無効になり、2つのオプションのみがオンになっていiます。

  • -h実行するコマンドを見つけるとき(ハッシュ)コマンドを見つけて覚えておいてください。
  • -Bシェルが中括弧拡張を実行できるようにする

set出力に表示される完全なオプションのリストを表示できます$-組み込みコレクション

-iシェルが対話型モードで実行されるように指示する対話型シェルで使用できる追加オプション

  • -mジョブ制御を許可
  • -H!スタイル履歴置換の有効化

答え2

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.

結局のところ、BashのPOSIX以外の対話型モードの場合、有効なオプションは次のとおりですhimBHs-i対話型モードの場合は、-s標準入力からコマンドを読み取るための他のオプションはにリストされていますhelp set)。

関連情報