2012-10-21 2 views
29

알림 스크립트를 강화하려고합니다. 스크립트가 작동하는 방식은 장시간 실행되는 셸 명령 뒤에 놓은 다음 장시간 실행되는 스크립트가 끝난 후 모든 종류의 알림이 호출된다는 것입니다. 예를 들어다른 스크립트에서 마지막 셸 명령의 종료 코드 받기

는 :

sleep 100; my_notify 

장기 실행 스크립트의 종료 코드를 얻을 좋을 텐데, 문제는 my_notify를 호출하면 $? 변수에 대한 액세스 권한이없는 새로운 프로세스를 생성하는 것입니다.

비교 :

~ $: ls nonexisting_file; echo "exit code: $?"; echo "PPID: $PPID" 
ls: nonexisting_file: No such file or directory 
exit code: 1 
PPID: 6203 

~ $: ls nonexisting_file; my_notify  
ls: nonexisting_file: No such file or directory 
exit code: 0 
PPID: 6205 

my_notify 스크립트는 그 안에 다음과 같습니다

#!/bin/sh 
echo "exit code: $?" 
echo "PPID: $PPID" 

나는의 종료 코드를 얻을 수있는 방법을 찾고 있는데요을 명령의 구조를 너무 많이 변경하지 않고 이전 명령. 나는 내가 더 바꿔서 time처럼 작동하도록한다는 사실을 알고있다. my_notify longrunning_command... 내 문제는 해결 될 것이지만 나는 명령의 끝에 그것을 집어 넣을 수 있으며 실제로이 두 번째 해결책의 복잡성을 두려워한다.

이 작업을 수행 할 수 있습니까? 아니면 쉘이 작동하는 방식과 근본적으로 호환되지 않습니까?

내 셸은 zsh이지만 bash도 사용하고 싶습니다.

답변

31

이렇게하려면 쉘 기능을 사용해야합니다. 그런 간단한 스크립트를 위해서는 zsh와 bash 모두에서 작업하는 것이 꽤 쉬워야합니다. 파일에 다음을 입력하십시오.

my_notify() { 
    echo "exit code: $?" 
    echo "PPID: $PPID" 
} 

그런 다음 쉘 시작 파일에서 해당 파일을 가져옵니다. 대화 형 쉘에서 실행되기 때문에 $ PPID보다는 $$를 사용하는 것이 좋습니다.

6

호환되지 않습니다. $? 만 현재 쉘 내에 존재합니다. 서브 프로세스에서 사용 가능하게하려면 환경 변수에 복사해야합니다.

대신 다른 방법으로 사용하는 셸 함수를 작성하는 것입니다.

2

이것을 구현하는 한 가지 방법은 my_notify 스크립트를 생성하는 EOF 태그와 마스터 스크립트를 사용하는 것입니다.


#!/bin/bash 

if [ -f my_notify ] ; then 
rm -rf my_notify 
fi 

if [ -f my_temp ] ; then 
rm -rf my_temp 
fi 

retval=`ls non_existent_file &> /dev/null ; echo $?` 
ppid=$PPID 
echo "retval=$retval" 
echo "ppid=$ppid" 
cat >> my_notify << 'EOF' 
#!/bin/bash 

echo "exit code: $retval" 
echo " PPID =$ppid" 
EOF 

sh my_notify 

당신은 당신의 목적을 위해이 스크립트를 수정할 수 있습니다.

관련 문제