2012-12-17 3 views
0

스크립트를 소싱하고 실행하는 유일한 차이점은 나중에 부모 환경이 영향을받지 않는다는 것을 알고있었습니다.스크립트를 소싱하고 KornShell에서 실행하는 동안의 동작 차이점

이 샘플 스크립트를 고려

SETUP_DIR=`dirname $0` 
echo $SETUP_DIR 
echo $0 
echo $1 

위의 스크립트는 단순히 실행중인 스크립트의 디렉토리 이름을 가져옵니다. 그것을 소스하는 동안, 위의 스크립트는 다음 오류와 함께 실패

$ . test.sh foo 
dirname: invalid option -- k 
Try `dirname --help' for more information. 

-ksh 
foo 

는 스크립트가 부모의 환경 쉘에서 실행되는, 쉘의 이름으로 전달되는, 그것을 소싱 날 때입니다에 보이는 이유 첫 번째 인수는이 경우 -ksh입니다.

  • 그래서 궁금
    $ sh 
    sh-3.2$ . test.sh foo 
    . 
    sh 
    foo 
    sh-3.2$ bash 
    bash-3.2$ . test.sh foo 
    . 
    bash 
    foo 
    bash-3.2$ 
    

    sh 또는 bash는 에서 실행하는 동안

    dirname -ksh 때문에 dirname

    이상하게

    에 대한 잘못된 옵션 인 -k, 실패,이 문제가되지 않습니다, KornShell (ksh)에서 잘 알려진 동작입니까? 이 문제를 해결하는 방법은 무엇입니까? 하지 dirname 'sh'man dirname에서, 두 번째 질문에 현재 디렉토리에게 대답에서 .

+0

내가 재현 할 수 있습니다 이후 너의 오류. 'dirname -ksh'이 효과가 있습니까? 'dirname'이주는 것은 무엇입니까? – dogbane

+0

@dogbane :'dirname -ksh'이 작동하지 않고 내 질문에서 언급 한대로 실패합니다. 기타 관련 정보 질문 자체에서 업데이트했습니다. – Abhijit

답변

1

옥수수 껍질에서 알려진 문서화 된 동작입니까? 이 문제를 해결하는 방법은 무엇입니까? KSH가 /bin/login으로 로그인 쉘로 시작

, 그 $0-로 시작되므로, $0-ksh 대신 단지 ksh 또는 /bin/ksh 될 것입니다. Login does this to indicate to the shell that it is being started as a login shell입니다. 일반적으로 프로필 로딩에 영향을 미치기 때문입니다. 쉘이 간부 (2) 인수 제로 ($ 0)의 첫 번째 문자에 의해 호출되면

입니다 - 다음, 쉘에 가정 :

는 KSH 설명서는이 협약의 준수를 문서화 로그인 쉘이되고 명령은 [...에서 읽습니다.]

하이픈 접두사가 bash와 함께 표시되지 않는다면, bash가 프로세스 목록에 표시되지 않도록 명령 줄을 편집한다고 가정합니다. 즉,

결과

, dirname $0dirname -ksh이며,이 dirname은 k, sh 옵션

명시 적으로 --dirname에 의해 구문 분석 옵션을 종료하여이 문제를 얻을 수 있습니다

통과로 그 구문 분석을 시도
dirname -- "$0" 

두 번째 일반적인 질문은 'dirname'sh '가 현재 디렉토리를 반환하는 이유입니다.

dirname 당신이 제공하는 경로의 디렉토리 부분이없는 경우에도 유용하고 유용한 경로를 반환하려고합니다. "$ 0"으로 만, 그것은, 즉 sh == ./sh 현재 작업 디렉토리를 기준으로하고,이 개정 향풀의 대답에 따라 설명되어있는 .

를 반환 한 부분 가정했다

+0

흥미 롭습니다. 나는 이것이 지금 나의 호기심을 가라 앉힐 것이라고 생각한다. 도와 주셔서 감사합니다 – Abhijit

+0

'dirname -ksh'을 실행하면'.'이됩니다. – dogbane

+0

@dogbane 당신은'dirname'의 다른 구현을 가지고있을 것입니다. 셸 내장으로. 광산은 GNU coreutils의'/ usr/bin/dirname'입니다 – je4d

1

를 반환하는 이유

  • 내 두 번째 일반적인 질문은, : 제거 된 후행/구성 요소

    인쇄 NAME; NAME에 /'이 없으면'. '을 출력하십시오. (현재 디렉토리를 의미).

    dirname sh을 실행할 때 .이 나오는 이유입니다.

    ksh에 오류를 재현 할 수 없습니다.

  • +0

    감사합니다. 방금 새로운 것을 배웠습니다 :-) – Abhijit

    관련 문제