私は/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
はどういう${-#*i}
意味ですか。 で始まるパラメータ展開の定義が見つかりません${-
。
答え1
$-
シェル自体、呼び出し時、またはset
組み込みコマンドを使用して設定された現在のオプション フラグです。
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
文字列削除の構文は次のとおりです: (POSIXドキュメント)
${パラメータ#[単語]}
最小のプレフィックス パターンを削除します。単語はパターンを生成するために拡張されます。パラメータ拡張の結果は、パターンに一致するプレフィックスの最小部分が削除されたパラメータになります。存在する場合、単語は引用符で囲まれていない '#' で始まってはなりません。
${パラメータ##[単語]}
最大のプレフィックス パターンを削除します。単語はパターンを生成するために拡張されます。その後、パラメータ拡張により、パターンに一致するプレフィックスの最大部分が削除されたパラメータが生成されます。
したがって、${-#*i}
最初の文字までの最短の文字列を削除しますi
。
$ echo "${-#*i}"
mBH
あなたの場合は、if [ "${-#*i}" != "$-" ]
シェルが対話型かどうかを確認します。
答え2
シェルパラメータがあります$-
。私の場合:
$ echo $-
himB
${-}
$-
は と全く同じです。${foo}
は と同じです$foo
。
#*i
意味: 変数値の先頭から最初の まで ( を含む ) を ( 可能な限り少なく、ここでは違いはありません ) 削除しますi
。
$ echo "${-#*i}"
mB
つまり、変数の値に[ "${-#*i}" != "$-" ]
があるかどうか、つまりシェルが対話型であるかどうかをチェックします。i
$-
言い換えれば、これは複雑で Bourne と互換性のない書き方です。
case $- in
*i*) ...;;
*) ...;;
esac