2013-10-09 1 views
2

, 나는 알아 내기 어려운 그 /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 

내 질문은 if 문 ${-#*i}$-의 변수입니다. 그게 무슨 뜻입니까? 왜 출력을 리디렉션하기 위해 else 문을 추가해야합니까? 감사합니다.

답변

8

$-variable which stores the current options set by the shell입니다.

${-#*i}은 부분 문자열 제거를 사용하여 변수 시작 부분에서 *i 패턴과 가장 짧은 일치를 제거합니다. 따라서 의 값이 abcifOO 인 경우 ${-#*i}fOO이됩니다. (You can read more about bash substrings here.)

이 가변 $-이 켜져 interactive mode 수단 i 옵션을 포함하는 경우 테스트

[ "${-#*i}" != "$-" ] 

사실 일 것이라는 것을 의미한다.

대화식 모드 인 경우 모두 출력이 /dev/null으로 리디렉션된다는 것을 의미합니다.

2

$-은 무엇을 의미합니까? 수동에서

:

-

. (하이픈) set 내부 명령에 의해, 호출에 지정된, 또는 그 쉘 에 의해 설정된 현재 옵션 플래그로 확장 자체 (예 : -i 옵션).

당신이 bash대화 형으로을 실행하고, 다음 $- 같은 뭔가 exapnd 수 있습니다 스크립트를 실행 할 때

himBH 

, $-는 다른 차별화 (i이없는 것 위의 플래그).

${-#*i}의 의미는 무엇입니까?

${-#*i}가 삭제 될 $-의 확장의 시작부터 *i의 짧은 일치가 발생 말하고. (Shell Parameter Expansion 참조). 요컨대

를 내부 if 예에서는 조건이 의미하는 대화 형 모드에서 실행 따르면서 :

. "$i" >/dev/null 2>&1 

및 비 - 대화 형 모드에서

다음 :

. "$i" 
4

쉘이 대화 형인지 확인하고 있습니다. 현재 쉘의 옵션은 $-이고, 뒤에 아무 것도 제거하지 않으면 i은 다른 결과를 산출합니다. 이는 i이 플래그 중 하나임을 나타냅니다.

하지만 이것은 훨씬 더 읽기 쉽고 관용적 것 :

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

또한, 루프 외부에 한 번 검사를 수행하는 것이 좋습니다 것입니다.

1

그냥 $ -에 대한 자세한 정보를 추가하십시오. 당신이 당신의 터미널을 입력하려고하면

[[email protected] ~]# echo $- 
himBH 

사람들은 '설정'쉘 것으로 보인다 값

조각을 info bash --index-search=set

'-h' 

에서 (해시)를 찾습니다 기억들이 고개대로 명령 실행. 이 옵션은 기본적으로 사용됩니다.

'-m' 

작업 제어가 활성화되어 있습니다 (* note Job Control : :).

'-B' 

쉘은 중괄호 확장을 (수행합니다 * 참고 중괄호 확장 : :). 이 옵션은 기본적으로 설정되어 있습니다.

'-H' 

'!' 스타일 내역 대체 (* 참고 내역 상호 작용 : :). 대화 형 쉘의 경우이 옵션은 기본적으로 설정됩니다.

+' rather than - '을 사용하면이 옵션이 해제됩니다. 옵션은 쉘 호출시 사용될 수도 있습니다.

관련 문제