bash에 이런 줄을 쓰면 어떻게 될까요?
commandA && commandB ; commandC
commandA
실패 하면 commandC
처형 되나요?
답변1
예, 직접 쉽게 확인할 수 있습니다.
$ non-existent-command && echo hi ; echo after semicolon
bash: non-existent-command: command not found
after semicolon
내용 man bash
은 다음과 같습니다:
명령은 ;;로 구분된 후 순차적으로 실행됩니다. 쉘은 각 명령이 차례로 종료될 때까지 기다립니다.
답변2
Bash 매뉴얼 페이지에 따르면
[L]ist 연산자 && 및 ||는 동일한 우선순위를 갖고 그 다음에는 동일한 우선순위를 갖는 ;
실제로 이는 결과 반환에 관심을 갖는 사람이 누구인지에 달려 있습니다. 결과가 즉시 필요한 경우 우선순위가 더 높습니다.
답변3
commandC
commandA
실패나 성공 여부 에 관계없이 commandB
실행됩니다 .
세미콜론은 명령을 순차적으로 실행하기 위한 구분 기호일 뿐입니다. commandC
이것이 실패할 수 있는 유일한 시나리오는 commandA
다음과 같습니다.commandB
exit
명령(또는 // /(또는 이러한 명령을 호출하는 함수)과 같이 워크플로에 강제로 영향을 미치는 명령 return
) break
:continue
exec
시나리오 1: commandA
예exit
[root@host ~]# exit && echo "HI"; echo "test"
logout
[user@host ~]$
시나리오 2: commandB
예exit
[root@host~]# echo "HI" && exit; echo "test"
HI
logout
[user@host ~]$
간단히 말해서: 그 캐릭터가 우선권을 갖는다는 뜻 아닌가요? 그들의 의미는 다릅니다. 하나는 논리 연산자이고 다른 하나는 목록 종결자입니다.
관련 정보:
쉘의 제어 및 리디렉션 연산자는 무엇입니까? 이 답변은 bash 연산자를 매우 잘 설명합니다. 답변의 짧은 인용문은 다음과 같습니다.
;
: 첫 번째 명령의 결과에 관계없이 다른 명령이 완료된 후 하나의 명령을 실행합니다.command1 ; command2
먼저
command1
전경에서 실행되고 완료되면command2
실행됩니다.문자열 리터럴에 없거나 특정 키워드 뒤에 줄 바꿈이 없습니다. 아니요세미콜론 연산자와 동일합니다. 간단한 명령의 구분된 목록
;
은 여전히 있습니다.목록- 쉘의 파서와 마찬가지로 실행하기 전에 계속해서 읽어야 합니다.;
개행 문자는 전체 명령 목록이나 목록 목록을 구분할 수 있습니다. 차이점은 미묘하지만 복잡합니다. 개행은 쉘이 개행 이후의 데이터를 읽는 이전 명령이 없다고 가정하고 쉘이 읽은 간단한 명령을 평가하기 시작할 수 있는 지점을 표시하는 반면 세미콜론은;
그렇지 않습니다.
쉘 스크립트 줄 끝에 세미콜론이 중복됩니까? 답변을 인용하자면:
줄 바꿈 문자도 명령 구분 기호이기 때문에 줄 끝에 있는 단일 세미콜론은 중복됩니다.
case
특히 각 패턴 블록의 마지막 명령 끝에 이중 세미콜론을 사용해야 합니다help case
.
답변4
다른 게시물에서 말했듯이, 짧은 대답은 "예, commandC
당신은 무슨 일이 있어도 처형될 것입니다." 입니다.
~처럼엔와일드나 탐험, 더 긴 대답은 다음과 같습니다. "예, commandC
무슨 일이 일어나더라도 쉘은 실행 가능한 상태인 한 실행됩니다 commandC
. 즉, 쉘은 그 이상 실행을 계속하지 않습니다.
commandA && commandB ; command
실행하지 않고 명령줄을 실행합니다 commandC
. "
간단히 말해서, commandA
(또는 commandB
)이 kill -KILL $$
셸을 종료하거나 손상시키거나 명령 흐름을 방해하는 다른 것이라면 commandC
실행되지 않습니다. (분명히 여기서는 극단적인 경우에 대해 이야기하고 있습니다.) set -e
(또는 이에 상응하는 set -o errexit
)이 방출되면 동작이 약간 다릅니다.
commandA
실패 하면commandC
실행됩니다(그러나commandB
실행되지는 않습니다).commandA
성공 하면commandB
실행됩니다.commandB
성공 하면commandC
실행됩니다.- 이것이 실패 하면
commandB
쉘은 다음commandC
과 같이 종료됩니다.아니요처형되었다.
이 errexit
옵션은 명령("파이프라인")이 실패할 경우 셸이 종료되도록 지정합니다. 단, 몇 가지 예외는 있습니다.
while
실패한 명령이 또는 키워드 바로 뒤의 명령 목록의 일부이거나,until
또는 예약어 뒤의 테스트의 일부이거나, a 내에서 실행된 명령의 일부인 경우 쉘은 종료되지 않습니다.if
elif
&&
또는||
마지막 명령을 제외한 명령&&
,||
마지막 명령을 제외한 파이프라인의 모든 명령 또는 명령의 반환 값이 반전된 경우 목록을 표시합니다!
.- 에서큰 타격(1)
따라서 commandA
실패 하면 다음과 commandB
같이 실행되지 않는 결과만 발생합니다.commandA
&&
. 그러나 실행이 실패하면 ( )가 (final)을 따르기 commandB
때문에 쉘이 종료됩니다 .commandB
&&