“$ {-# * i}”! =“$-”은 무슨 뜻입니까?


37

에서 /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}뜻 입니까? 시작하는 매개 변수 확장의 정의를 찾을 수 없습니다 ${-.

답변:


40

$-쉘 자체, 호출시 또는 set내장 명령을 사용하여 설정 한 현재 옵션 플래그입니다 .

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"문자열 제거 구문은 다음과 같습니다 ( POSIX 설명서에서 ).

$ {parameter # [word]}

가장 작은 접두사 패턴을 제거하십시오. 단어는 패턴을 만들기 위해 확장되어야한다. 그런 다음 매개 변수 확장은 삭제 된 패턴과 일치하는 접두사의 가장 작은 부분을 갖는 매개 변수가됩니다. 있는 경우 단어는 따옴표없는 '#'으로 시작하지 않습니다.

$ {parameter ## [word]}

가장 큰 접두사 패턴을 제거하십시오. 단어는 패턴을 만들기 위해 확장되어야한다. 그런 다음 매개 변수 확장은 삭제 된 패턴과 일치하는 접두어의 가장 큰 부분과 함께 매개 변수가됩니다.

따라서 ${-#*i}첫 번째 i문자 까지 가장 짧은 문자열을 제거하십시오 .

$ echo "${-#*i}"
mBH

귀하의 경우 if [ "${-#*i}" != "$-" ]쉘이 대화 형인지 확인하십시오.


23

쉘 매개 변수가 $-있습니다. 나의 경우에는:

$ echo $-
himB

${-}$-정확히 ${foo}동일합니다 $foo.

#*i의미 : 변수 값의 시작에서 첫 번째를 포함하여 (가능한 한) 삭제하십시오 (여기서 차이는 없습니다) i.

$ echo "${-#*i}"
mB

: 환언 [ "${-#*i}" != "$-" ]존재 하는지를 점검 i의 값에 $-쉘이 상호 작용하면 체크 가변.

다시 말해서, 그것은 복잡하고 Bourne과 호환되지 않는 쓰기 방법입니다.

case $- in
  *i*) ...;;
  *) ...;;
esac

4
그것은 이다 POSIX 호환 하지만.
grawity
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.