![bash: 종료 코드가 다른 여러 명령이 한 줄에 있음](https://linux55.com/image/82904/bash%3A%20%EC%A2%85%EB%A3%8C%20%EC%BD%94%EB%93%9C%EA%B0%80%20%EB%8B%A4%EB%A5%B8%20%EC%97%AC%EB%9F%AC%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%ED%95%9C%20%EC%A4%84%EC%97%90%20%EC%9E%88%EC%9D%8C.png)
bash
코드에서 명령을 실행하기 위해 에 제공된 함수를 사용하고 있습니다 . 내 질문은 구현에 관한 것이 아니지만 내 질문과 관련된 한 가지는 한 줄에 여러 명령을 실행해야 한다는 것입니다.c++
system
cstdlib
c++
예를 들어, 다른 디렉터리에 포함된 gnuplot 스크립트를 실행합니다. 그래서 내 명령은 다음과 같습니다.
cd some/path; gnuplot -e gnuplot_file.gp; cd - > /dev/NULL
cd
두 명령 모두 개인적인 이유로 중요합니다. 또한 출력을 "숨기고" 싶습니다 /dev/NULL
.
gnuplot
내 질문은 다음과 같습니다. 명령의 종료 상태를 어떻게 알 수 있나요 ? 실패 여부를 아는 것만으로도 충분합니다.
내 문제는 현재 마지막 명령이 실패하더라도 종료 상태를 얻는다는 것입니다 gnuplot
.
&&
대신 사용하면 ;
이전 명령이 실패하고 종료 상태가 false가 되면 마지막 명령이 실행되지 않는다는 것을 알고 있습니다. 하지만 마지막 명령을 실행해야 하는데...
해결책은 무엇입니까?
답변1
서브쉘에 넣으면 gnuplot
마지막으로 실행되는 명령이 됩니다. 또한 cd
서브셸 시작 시 디렉터리 변경 사항은 해당 디렉터리에만 영향을 주기 때문에 더 이상 마지막 디렉터리가 필요하지 않으므로 gnuplot
해당 디렉터리로 리디렉션하는 것도 /dev/null
의미가 없습니다.
( cd some/path; gnuplot -e gnuplot_file.gp )
/dev/null
어쩌면 전체 명령에 리디렉션을 적용하려고 하시나요 ? (그러나 그것은 귀하의 질문에 쓴 내용이 아닙니다.)
( cd some/path; gnuplot -e gnuplot_file.gp ) >/dev/null
마지막으로, 제가 선호하는 이와 같은 코드 조각은 gnuplot
초기 성공 시에만 실행되는 것입니다 cd
. 이는 종료 상태에 영향을 미칩니다.실패디렉토리 변경이 실패하면 반환하지만 아마도 더 안전한 코드일 것입니다.
( cd some/path && gnuplot -e gnuplot_file.gp ) >/dev/null
답변2
반환 값을 변수에 저장합니다.
cd some/path; gnuplot -e gnuplot_file.gp; gnuplot_ret=$?; cd "$OLDPWD"; exit $gnuplot_ret
또 다른 방법: 서브셸에서 실행:
(cd some/path; gnuplot -e gnuplot_file.gp)
디렉터리 변경은 하위 셸에서 발생하므로 현재 셸에 영향을 주지 않으며 cd
반환할 필요가 없습니다. 그리고 무료로 종료 상태를 얻을 수 있습니다.
답변3
변수에서 종료 코드를 캡처할 수 있습니다.
cd some/path; gnuplot -e gnuplot_file.gp ; a=$?
콘솔 출력 없이 이전 디렉터리로 돌아갑니다.
cd -- "$OLDPWD"
종료 코드 인쇄
그런 다음 캡처된 종료 코드(전체 줄)를 인쇄합니다.
cd some/path; gnuplot -e gnuplot_file.gp ; a=$?; cd -- "$OLDPWD"; echo "$a"
종료 코드를 다시 만들어야 하는 경우 몇 가지 가능한 방법이 있습니다.
[ "x$a" == 'x0' ]
[ "$a" -eq 0 ]
[ ! "${a#0}" ]
[[ $a == 0 ]]
[[ $a -eq 0 ]]
오류 종료 코드는 1을 제외한 모든 숫자일 수 있으므로 "${a#1}"를 사용하지 않는 것이 좋습니다. a
오류 종료 코드 1은 보장되지 않습니다 .
또는 a는 숫자이므로 산술 솔루션(bash) 사용을 허용하는 경우:
(( a == 0 ))
! (( a ))
(( ! a ))
종료 코드를 다시 작성하십시오..
전체 줄은 다음과 같습니다.
cd some/path; gnuplot -e gnuplot_file.gp ; a=$?; cd -- "$OLDPWD"; (( ! a ))
종료 코드는 0 또는 1이며 모든 오류는 종료 코드 1을 보고합니다.
전체 종료 코드
exit "$a"
An이 스크립트 실행을 종료하는 데 도움이 되는 경우에만 유용합니다.
이렇게 하면 실제 종료 코드가 유지된다는 점을 이해하세요.
cd some/path && gnuplot -e gnuplot_file.gp ; a=$?; cd -- "$OLDPWD"; exit "$a"
함수 내에서 "return "$a""를 사용하면 유용할 수 있습니다.
function_gnuplot(){
cd some/path && gnuplot -e gnuplot_file.gp ; a=$?
cd -- "$OLDPWD"; return "$a"
}
답변4
호출하기 전에 코드에서 디렉터리를 변경할 수 있습니다.system
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUFFSIZE 1024
int main(int argc, char **argv) {
char old_dir[BUFFSIZE];
getcwd(old_dir, BUFFSIZE);
chdir("some/path");
int retvalue=system("gnuplot -e gnuplot_file.gp");
chdir(old_dir);
if (retvalue == -4) {
/* do something ... */
}
}
해결 방법은 다음과 같습니다.스레드로부터 안전하지 않음프로세스의 현재 디렉토리가 변경되었기 때문입니다.