bash: 종료 코드가 다른 여러 명령이 한 줄에 있음

bash: 종료 코드가 다른 여러 명령이 한 줄에 있음

bash코드에서 명령을 실행하기 위해 에 제공된 함수를 사용하고 있습니다 . 내 질문은 구현에 관한 것이 아니지만 내 질문과 관련된 한 가지는 한 줄에 여러 명령을 실행해야 한다는 것입니다.c++systemcstdlibc++

예를 들어, 다른 디렉터리에 포함된 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 ... */
  }
}

해결 방법은 다음과 같습니다.스레드로부터 안전하지 않음프로세스의 현재 디렉토리가 변경되었기 때문입니다.

관련 정보