쉘 스크립트는 명령을 순차적으로 실행합니까?

쉘 스크립트는 명령을 순차적으로 실행합니까?

약간 불안정하고 때때로 SSL 오류를 발생시키는 Python 스크립트가 있습니다. 일부 라이브러리에 깊이 묻혀 있는 일부 함수에 의해 예외가 발생하므로 기본적으로 해결 방법이 없습니다.

나는 여러 번 실행되는 while 루프를 사용하여 쉘 스크립트를 생성하고 루프 내에서 Python 스크립트를 실행하여 해키 솔루션을 구현했습니다.

이제 내가 원하는 것은 루프 반복이 시작되고 스크립트가 실행될 때 Python 스크립트가 실패하고 루프의 다음 반복이 스크립트를 다시 실행할 때까지 쉘 스크립트 내부의 루프가 원래 위치에 유지된다는 것입니다. .

이것이 효율적인가요? 더 좋은 방법이 있나요? 가장 중요한 것은 맞습니까?

답변1

존재하다:

cmd1
cmd2

또는

cmd1; cmd2

순차적으로 실행됩니다.

존재하다

cmd1 && cmd2

또는

cmd1 || cmd2

순서대로 실행되지만 cmd2실행 여부는 전적으로 cmd1성공(for &&) 또는 실패(for ||)에 따라 달라집니다.

존재하다

cmd1 | cmd2

또는

cmd1 & cmd2
cmd1 |& cmd2 # ksh
coproc cmd1; cmd2 # bash/zsh

또는

cmd1 <(cmd2) # ksh/zsh/bash (also yash though with a different meaning)

동시에 실행됩니다. 첫 번째 경우 일부 쉘은 나머지 스크립트를 계속하기 전에만 기다리는 cmd2반면, 다른 쉘은 두 스크립트를 모두 기다립니다. 두 번째 경우에는 셸이 대기합니다 cmd2( cmd1비동기적으로 실행된다고 함(또는 대화형 셸에서 실행될 때는 백그라운드에서 실행된다고 함)). 반면에 세 번째 경우에는 cmd1( cmd2비동기적으로) 실행됩니다.

존재하다:

< "$(cmd1)" x=$(cmd2) y=$(cmd3) cmd4 "$(cmd5)" > "$(cmd6)"

명령은 순차적으로 실행되지만 순서는 셸에 따라 다릅니다. 어쨌든 cmd4마지막에 실행됩니다.

존재하다:

cmd1 =(cmd2) # zsh

순서대로(먼저) 실행됩니다 cmd2.

이러한 모든 경우에 이러한 명령은 다른 프로세스를 시작할 수 있습니다. 쉘은 이에 대해 알지 못하므로 이를 기다리는 것이 불가능합니다.

답변2

예. 맞습니다. 생각해 보세요:

#!/bin/bash

while true; do
    sleep 1
    echo "Slept 1"
    echo "Exit status $?, ok."
    sleep 1
    echo "Slept 1, now executing faulty command 'ps q'"
    ps q
    echo "Exit status $?, not ok. Loop continues forever..."
done

...실행되면 다음과 같습니다.

./loop.sh 
Slept 1
Exit status 0, ok.
Slept 1, now executing faulty command 'ps q'
ps: illegal option -- q
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]]
          [-u]
          [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]
       ps [-L]
Exit status 1, not ok. Loop continues forever...
Slept 1
Exit status 0, ok.
Slept 1, now executing faulty command 'ps q'
ps: illegal option -- q
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]]
          [-u]
          [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]
       ps [-L]
Exit status 1, not ok. Loop continues forever...
^C

루프가 항상 존재하는 한 true루프 내부의 프로그램에 어떤 종료 코드가 있는지는 중요하지 않습니다. 작성된 순서대로 계속 실행됩니다.

이것이 효율적인가요? 더 좋은 방법이 있나요?

이것최고해결책은 Python 프로그램의 버그를 제거하는 것입니다!

답변3

제목 질문에 대답하려면 다음을 수행하십시오. 예, 셸 스크립트의 명령은 순서대로 동기식으로 실행되므로 Python 스크립트가 실행되는 동안 셸이 차단됩니다.

물론 오류의 원인을 수정하는 것이 더 좋지만 이것이 옵션이 아닌 경우 while true;do ./script.py; if [[ "$?" = 0]];break;done0 상태 코드가 반환될 때까지 쉘 스크립트가 Python 스크립트를 실행하려고 시도하는 것이 현명한 접근 방식입니다( ).

관련 정보