나는 /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