/ / if [“ $ {-#* i}”!=“ $-”]はどういう意味ですか? -Linux、bash、シェル

if ["$ { - #* i}"!= "$ - "]の意味は何ですか? - linux、bash、shell

私のOracle Linuxボックスで、スクリプトのブロックを見つけました /etc/profile それを理解するのは難しいです:

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done

私の質問はifステートメントの変数です ${-#*i} そして $-。 どういう意味ですか?そして、出力をリダイレクトするためにelseステートメントを追加する必要があるのはなぜですか? ありがとう!

回答:

回答№1は8

$- 〜です シェルによって設定された現在のオプションを保存する変数.

${-#*i} サブストリング除去を使用して、パターンへの最短一致を除去します *i 変数の先頭から。だから $- 価値がある abcifOO 次に ${-#*i} だろう fOO. (bash部分文字列の詳細については、こちらをご覧ください。)

これは、テストが

[ "${-#*i}" != "$-" ]

変数が $- オプションが含まれています iこれは、 インタラクティブモード オンになっています。

すべて一緒にこれは、出力がのみにリダイレクトされることを意味します /dev/null 対話モードの場合。


回答№2については4

シェルが対話型かどうかを確認します。現在のシェルのオプションは $- そして、その後に続くものを削除する場合 i 別の結果が得られる、つまり i 旗の中にありました。

しかし、これははるかに読みやすく慣用的です:

case $- in *i* ) ... ;; esac

また、ループの外側で1回チェックすることをお勧めします。


答え№3の2

何をする $- 平均?

マニュアルから:

-

(ハイフン。)呼び出し、set builtinコマンド、またはシェルによって設定されたコマンドで指定された現在のオプションフラグに展開します。 それ自体(など -i オプション)。

あなたが走っているとき bash インタラクティブに、その後 $- 次のようなものになります:

himBH

スクリプトを実行しているとき、 $- 持っていないだろう i (上記の他のフラグを除く)。

何をする ${-#*i} 平均?

言う ${-#*i} の最短一致を引き起こします *i の拡大の始まりから $- 削除されます。 (参照する シェルパラメータの拡張。)

要するに、内側 if この例の条件付きは、インタラクティブモードで次のことが実行されることを意味します。

. "$i" >/dev/null 2>&1

非対話型モードでは、次のようになります。

. "$i"

回答№4の場合は1

$-についてもう少し詳しく説明します。ターミナルに入力しようとすると

[root@zee ~]# echo $-
himBH

それらはシェルの「設定」値のように見えます

からのスニペット info bash --index-search=set

 "-h"

探しているコマンドを見つけて覚えておく(ハッシュ) 実行。このオプションはデフォルトで有効になっています。

 "-m"

ジョブ制御が有効になっています(*ジョブ制御::に注意してください)。

 "-B"

シェルはブレース拡張を実行します(*ブレースに注意してください) 拡張::)。このオプションはデフォルトでオンになっています。

"-H"

「!」を有効にするスタイル履歴の置換(*履歴に注意) インタラクション::)。このオプションは、インタラクティブではデフォルトでオンになっています シェル。

使用 +" rather than-"を指定すると、これらのオプションがオフになります。 オプションは、シェルの呼び出し時にも使用できます。