오류 코드를 터미널 외부로 어떻게 전파할 수 있나요?

오류 코드를 터미널 외부로 어떻게 전파할 수 있나요?

Bash 스크립트 내부의 새 터미널 창에서 시작된 프로그램의 오류 코드를 검색하려고 합니다. 다음과 같이 단순화할 수 있습니다.

#!/bin/bash
urxvt -e bash -c "exit 4"
echo $?

출력: 0

urxvt를 호출하는 스크립트에서 "4"에 액세스하고 싶습니다. 어떻게 해야 하나요? :)

답변1

uxvrtAFAIK 그래픽 터미널에는 실행 중인 프로그램에 대한 반환 코드를 제공할 수 있는 유틸리티가 없습니다 .

내가 생각할 수 있는 가장 좋고 가장 간단한 방법은 내부에서 하위 쉘을 실행하고 bash(약간 혼란스러워 보이지만 저를 믿으십시오) 내부에서 원하는 프로그램을 실행 bash하고 외부 쉘을 사용하여 반환 코드를 처리하는 것입니다. 이는 아래와 같습니다. :

urxvt -e bash -c ' (exit 4) ; echo $? > error.code '

이제 파일에서 반환 코드를 읽을 수 있습니다 error.code.

echo코드를 반환 하면 urxvt몇 천 초 후에 닫히는 창 에 코드가 인쇄되므로 임시 파일이 있어야 합니다 . 그래서 당신은 유용한 것을 얻지 못할 것입니다.

답변2

이것은 Parsa Mousavi의 답변의 확장입니다. 작업을 수행하는 동안 그보다 더 복잡한 작업을 수행하는 경우 따옴표를 추적하지 못할 exit 4수 있습니다.

보다 유연한 옵션은 다음과 같습니다.

#!/bin/bash
myfunc(){
    (
    #Other statements...
    exit 4
    )
    echo $? > errorcode
}

export -f myfunc

uxrvt -e bash -c 'myfunc'
echo "Error code:"
cat errorcode

bash새 터미널에서 실행되는 프로그램도 이 기능을 얻으 려면 내보내기가 필요합니다 .

POSIX 쉘은 함수 내보내기를 허용하지 않습니다. 이식 가능한 대안으로 단순화를 위해 동일한 디렉터리에 두 개의 스크립트를 만듭니다.

main:

#!/bin/sh
urxvt -e sh -c './secondary'
echo "Error code of secondary:"
cat errorcode

secondary:

#!/bin/sh
myfunc(){
    #Here your statements...
    exit 4
}

(myfunc)
echo $? > errorcode

실행 가능( chmod +x main secondary) 및 실행을 모두 만듭니다 ./main. 당신은 자격이

Error code of secondary:
4

서브쉘에서 실행된다는 점에 유의하십시오 myfunc. 그렇지 않으면 프로그램이 종료되고 해당 echo $?행이 실행되지 않습니다.

관련 정보