在/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
$-
是 shell 本身在呼叫時或使用set
內建指令設定的目前選項標誌:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
是字串刪除的語法:(來自POSIX 文檔)
${參數#[字]}
刪除最小前綴模式。該詞應擴展以產生一種模式。然後,參數擴展應產生參數,其中前綴的最小部分與刪除的模式相符。如果存在,單字不得以不帶引號的「#」開頭。
${參數##[字]}
刪除最大前綴模式。該詞應擴展以產生一種模式。然後,參數擴展應產生參數,其中前綴的最大部分與刪除的模式相符。
因此${-#*i}
刪除最短的字串直到第一個i
字元:
$ echo "${-#*i}"
mBH
對於您的情況,if [ "${-#*i}" != "$-" ]
檢查您的 shell 是否是互動的。
答案2
有一個shell參數$-
。就我而言:
$ echo $-
himB
${-}
與$-
完全一樣${foo}
與 相同$foo
。
#*i
意思是:從變數值的開頭刪除(盡可能少;這裡沒有區別)直到(包括)第一個i
.
$ echo "${-#*i}"
mB
換句話說:檢查變數的值中[ "${-#*i}" != "$-" ]
是否有an ,也就是檢查shell是否是互動的。i
$-
換句話說,這是一種複雜且與 Bourne 不相容的寫作方式:
case $- in
*i*) ...;;
*) ...;;
esac