2012-09-05 3 views
0

최근에 ksh93 쉘로 전환했습니다. 나는 몇 가지 간단한 스크립트 내가 이해하지 못하는 방식으로 오작동 시작되었는지 않았기 때문에 내 .profile 파일새뱅이 다른 쉘을 참조 할 때 이상한 스크립트 동작

export SHELL=/usr/local/bin/ksh93 
exec $SHELL 

에 다음 두 줄을 추가하여 이런 짓을. 내가 명령 test.sh fred를 입력하면 내가라고 다음과 같은 간단한 스크립트로 좁혀 나가 동일한 출력 test.sh fred을 보여야하는데

#!/bin/ksh 
echo $0 $1 

test.sh을 말한다. 대신 test.sh noglob이 표시됩니다. 내가 약자를 제거하거나 #!/usr/local/bin/ksh93으로 변경하면 스크립트가 예상대로 작동합니다.

아무도 무슨 일이 일어나고 있는지 또는 어떻게해야 할 지 설명 할 수 있습니까? 나는 혼란 스럽다.

차이점이 있으면 Solaris 5.9를 사용하고 있습니다.

+1

'/ bin/ksh'에 무엇이 있습니까? 아마도'$ 1'의 값을 어떻게 든 부주의 한 것으로 대체하는 쉘 스크립트 일 것입니다. – tripleee

+0

@tripleee/bin/ksh는 korn 쉘입니다 (ksh93으로 전환하기 전에 사용하고 있던 쉘) – john

+0

'/ bin/ksh -x -c 'echo "$ 0" "$ 1"''을 실행하면 어떻게됩니까? – tripleee

답변

2

를 사용하는 것이 좋습니다 것입니다. 옵션이없는 set 명령은 명령 줄 매개 변수를 설정합니다. 따라서 $1이 "noglob"인 이유는 set -o noglob이어야합니다.

그건 그렇고, 설정 noglob 이상한입니다, 당신이 원합니까? /bin/ksh이 콘은 88
.kshrc에 관해서 ksh88 및 ksh93의 사이에는 중요한 차이가 있습니다 쉘입니다 (다른 언급이)

나는 생각한다. ksh88에서 .kshrc은 모든 korn 쉘 프로세스에 대해 실행됩니다. 대화식이 아닌 대화식 스크립트 (스크립트)도 실행됩니다. ksh93에서 .kshrc은 쉘 스크립트 용으로 실행 된 이 아니고 대화 형 로그인 쉘에서만 실행됩니다.입니다.

exec $SHELL이 로그인 쉘이 아닌 경우 /etc/passwd에서 항목을 변경하는 것이 좋습니다. 그건 그렇고, 변수 SHELL을 사용하는 것은 나쁜 생각입니다. 로그인 쉘에 의해 설정되기 때문입니다.

+0

의견에 감사드립니다. 나는 당신이 제기 한 대부분의 문제를 알고 있습니다. 불행히도/etc/passwd를 바꾸는 것은 실용적이지 못하다. 너무 많은 관료주의가 수반된다. 이 noglob 세트는 C 쉘용인지 알지 못한 채 http://www.mkssoftware.com/docs/man1/resize.1.asp 지시 사항을 따르기 때문에 설치되었습니다. 나는 그것을 지금 고쳤다. – john

+0

솔라리스 10의 중간에서'$ ENV'에 대한'ksh88sun' 동작이 업데이트/패치에서 수정되었습니다. 그때까지'$ ENV'가 스크립트에서 사용되는 것을 막기 위해'#!/bin/ksh -p'로 스크립트를 시작하는 것이 일반적이었습니다. * (-p 옵션은 해결 방법 이상이었습니다) * –

1

아마도 noglob가 옵션으로 설정된 시스템의 ksh에 별명이 있거나 noglob가 이전 쉘에서 기본 매개 변수로 전달되고 있습니다. 또한 실제로 호출중인 ksh를 확인해야합니다 (/ bin/ksh의 다른 쉘에 대한 링크가 있는지 확인하십시오). ksh --version은 약간의 통찰력을 제공해야합니다. 마지막 지점으로

대신 쉘을 호출하는 바로 내가 당신의 .kshrcset noglob을 가지고 의견에서 내가 알

#!/usr/bin/env ksh 
+0

필자는 ksh에 대한 별칭이 없으며/bin/ksh에 대한 링크도 없습니다. 'ksh -version'은 단지'-version : 나쁜 옵션 (들)'이라는 오류를줍니다. 나는 기본 주장에 대해 조금 이해하지 못한다. '#!/usr/bin/env ksh'를 사용하면 아무런 효과가 없습니다. – john

+0

죄송합니다. ksh --version입니다. #!/usr/bin/env PROGRAM은 스크립트를 시스템과 독립적으로 만들어주기 때문에 따라야하는 일반적인 규칙입니다. ksh -o를 시도하면 모든 ksh 쉘 옵션이 표시됩니다 (glob/noglob 중 하나임). 버전 번호는이 이상한 행동에 대한 더 많은 통찰력을 제공합니다. – count0

+0

'ksh --version'은 출력을 생성하지 않으며,'ksh -o'는 noglob을 off라고합니다. – john

관련 문제