私の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
-"を指定すると、これらのオプションがオフになります。 オプションは、シェルの呼び出し時にも使用できます。