2012-07-27 5 views
6

출구 명령이 동일한 스크립트 ()에서 실행 된 후에 실행해야하는 쉘 스크립트에서 명령이있는 상황이 있습니다. 내가 뭔가를 미친 소리 !! 알고!) 내가 exit $?를 실행 한 후 명령을 touch ~/abc.txt 실행하려면 다음쉘 스크립트 : 쉘 스크립트에서 "exit"명령을 실행 한 후 명령 실행

#!/bin/sh 
ls -l ~/. 
exit $? 
touch ~/abc.txt 

같은위한 솔루션 및 명령을 찾으려면

touch ~/abc.txt 될 수 있습니다 모든 명령.

제약 : 1) 위 스크립트의 exit $? 부분을 수정할 수 없습니다. 2) 명령은 exit $? 명령 뒤에 만 실행해야합니다.

해결 방법이 있는지 확실하지 않지만 도움이 필요합니다.

+0

왜 첫 번째 줄을 수정할 수 없는지 알고 있습니다. – arkascha

+0

죄송합니다! 지금 내 질문의 제약 조건 부분을 편집했습니다. 스크립트에서 아무 것도 바꿀 수는 있지만 퇴장 명령은 그대로 있어야합니다 !! – latestVersion

+0

스크립트를 수정할 수 없다면, 어떻게'touch' 명령을 추가 할 것으로 예상합니까? 스크립트를 수정할 수 없다면 왜 그 스크립트를'exit' 파일에 추가 할 수 없습니까? – Shahbaz

답변

10

일반적인 접근 방식은 트랩을 설정하는 것입니다. 일부 쉘 (예 : bash)에서는 스크립트가 신호의 결과로 종료되지만 다른 스크립트 (예 : dash)에서는 종료되지 않으면 트랩이 실행됩니다. 마지막 명령이 exit 인 경우에만 명령을 호출 할 수있는 이식성이 없습니다.

+0

감사합니다! 이것은 도움이됩니다. – latestVersion

0

어떤 방식 으로든 직접적인 방법이 가능한지 의심 스럽습니다.

하지만 해결 방법이있을 수 있습니다. 실행중인 스크립트를 다른 프로세스로 래핑 할 수 있습니까? 그런 다음 래핑 된 스크립트가 exit()를 실행하고 스택에서 제거되면 래핑 스크립트에서 원하는 것을 호출 할 수 있습니다.

1

왜 그런 식으로하고 싶은지 모르겠지만 어쩌면 이런 식으로 시도해보십시오. 스크립트를 다른 스크립트로 감쌀 수 있습니다. 상위 스크립트에서 eval 또는 source와 같은 명령으로 하위 스크립트를 평가 한 다음 하위 스크립트에서 마지막 명령을 추출하고 동일한 방식으로 별도로 실행하십시오.

trap 'touch ~/abc.txt' 0 

이 때 쉘이 종료 터치 명령을 호출합니다 :

+0

+1 : 추출 트릭은이 답변을 나의 것보다 더 잘 만듭니다. – arkascha

+0

vFabric tcServer의 "tcruntime-ctl.sh"스크립트를 수정하면서 스크립트에서 래퍼를 사용할 수 없습니다. – latestVersion

+0

나는 지금이 스크립트 만 수정하도록되어 있습니다! : – latestVersion

0

OP가 출구를 이동하지 않으려는 경우에도 작동합니다.

#!/bin/sh 
ls -l ~/. 
RES=$?  #save res for later. 
touch ~/abc.txt 
exit $RES