논리 연산자 및 세미콜론 우선 순위

논리 연산자 및 세미콜론 우선 순위

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

commandCcommandA실패나 성공 여부 에 관계없이 commandB실행됩니다 .

세미콜론은 명령을 순차적으로 실행하기 위한 구분 기호일 뿐입니다. commandC이것이 실패할 수 있는 유일한 시나리오는 commandA다음과 같습니다.commandBexit명령(또는 // /(또는 이러한 명령을 호출하는 함수)과 같이 워크플로에 강제로 영향을 미치는 명령 return) break:continueexec

시나리오 1: commandAexit

[root@host ~]# exit && echo "HI"; echo "test"
logout
[user@host ~]$

시나리오 2: commandBexit

[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 내에서 실행된 명령의 일부인 경우 쉘은 종료되지 않습니다.ifelif&&또는||마지막 명령을 제외한 명령 &&, ||마지막 명령을 제외한 파이프라인의 모든 명령 또는 명령의 반환 값이 반전된 경우 목록을 표시합니다 !.

- 에서큰 타격(1)

따라서 commandA실패 하면 다음과 commandB같이 실행되지 않는 결과만 발생합니다.commandA&&. 그러나 실행이 실패하면 ( )가 (final)을 따르기 commandB때문에 쉘이 종료됩니다 .commandB&&

관련 정보