コマンドを使用してコンソール設定を印刷すると、デフォルトで出力が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
スクリプトを実行すると、親シェル(コマンドを実行するシェル)はスクリプトを実行するために非対話型シェルを起動します。このシェルでは対話型フラグが無効になり、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
)。