/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