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

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

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

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

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

이렇게 하는 게 효율적인가요? 더 좋은 방법이 있나요? 그리고 가장 중요한 것은 그것이 맞는가?

답변1

안에:

cmd1
cmd2

또는

cmd1; cmd2

순차적으로 실행됩니다.

~ 안에

cmd1 && cmd2

또는

cmd1 || cmd2

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

~ 안에

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 스크립트가 실행되는 동안 셸이 차단됩니다.

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

관련 정보