2011-11-21 2 views
3

저는 데이터 분석 프로젝트에서 누군가와 협력하고 있으며, 우리는 작은 쉘 스크립트에 넣어서 수행하는 단계를 자주 문서화합니다. 문제는 내가 bash를 사용하고 다른 사람이 csh를 사용한다는 것입니다. 다른 사람은 source을 사용하여 직접 스크립트를 실행하는 대신이 스크립트를 실행하는 습관이 있습니다. (이 습관은 여분의 쉘을 생성하는 것이 자원 낭비 일 뿐이므로 아마 너무 바꿔서 변경할 수 있습니다.) 내 스크립트 (물론 bash 스크립트 임)를 csh 대신 bash로 실행하도록 상기시켜주는 메시지로 끝내기 만하면된다. 동시에, 나는 그들이 bash 스크립트로 계속 기능하도록하고 싶다.bash에서 no-op이지만 csh에서 오류 메시지와 함께 멈추는 코드는 무엇입니까?

그래서 스크립트 시작 부분에 bash의 no-op이지만 오류를 알리고 나머지 파일 실행을 취소 할 수있는 코드가 있습니다 (그러나 쉘 자체는 죽이지 않음). cshell에서 소스?

답변

6

이것은 csh의 고대 변수 변종으로 인해 생각했던 것보다 어렵습니다. 그러나 $?BASH_VERSION은 csh에서 0 (설정되지 않음)으로 확장되고 bash에서는 0BASH_VERSION (또는 마지막 명령의 RV가 무엇이든)으로 확장됩니다. 따라서

test "$?BASH_VERSION" = 0 && exit 1 

트릭을 수행해야합니다.

+0

테스트 해 보셨습니까? 나는'csh'을 모르지만, 지금 당장 놀아 보면,'test -n "$ BASH_VERSION"|| ... '는 오류 메시지를 출력했지만'...'하지 않았습니다. 그러나 밝은면에서 나는'source'd 스크립트의'exit'가 쉘을 죽이지 않았 음을 발견했습니다. (단서가없는 이유는 없습니다.) 그래서 'exit'는 좋은 시작입니다. – ruakh

+0

@ruakh : 아니요, 죄송합니다. 나는 | csh에 들어가기에 충분할만큼 C와 같을 것이다. – thiton

+0

@ruakh :'||'는 괜찮 았지만 변수 교체가 나를 죽였다. 편집 됨. – thiton

1

같은 방법으로 변수를 지정하거나 if 문을 같은 방식으로 실행할 수 없기 때문에 쉽지 않습니다.

csh의 빈약 한 문자열 구문 분석 기술을 자체에 사용할 수 있습니다. 사용

test '\\' = "\\" && echo "CSH detected" 

생각 다음이 실행 깨끗하게 모든 쉘에서, 나는 (리눅스, AIX, HP-UX, 솔라리스)에 그것을 테스트 한 모든 플랫폼에서 KSH, BASH, zsh을, CSH 및 SH 포함 CSH의 큰 따옴표로 묶인 문자열에서는 백 슬래시가 특별하지 않지만 다른 모든 셸에서는 다른 것으로 간주됩니다.

그러나 '잘못된'셸이 감지되면 스크립트를 종료하지 않으려면 어떻게해야할까요? 자, 스크립트에 Bournish sh 부분과 csh 부분을 갖고 싶을 수 있습니다. 당신이 따옴표를 사용하지 않는 코드에 국한 csh 코드를 유지할 수있는 경우

, 다음은 어디서나 작동합니다

test '\\' = "\\" && goto csh 
# Just skip the block containing the csh code. Again we use csh's meagre string parsing capabilities against it. 
false || csh_code_block=' 
csh: 
    ... csh code goes here ... 
    exit 0 
' 
... sh code goes here ... 

를 사용하면 HP-UX의 csh (조금 더 나은 보인다 걱정하지 않는 경우 구문 분석에서 다른 것보다) 다중 인용 단일 인용 명령을 'HERE'문서 (<<CSH_BLOCK ... CSH_BLOCK)로 바꿀 수 있습니다. 'goto'문은 건너 뛴 모든 구문이 마음에 들지 않으므로 순서를 바꿀 수 없습니다.

+0

단일 스크립트 파일에 두 쉘 모두에 (거의) 임의의 코드를 삽입하는 방법에 대한보다 일반적인 대답을 보내 주셔서 감사합니다. –

관련 문제