||의 경우 두 명령을 실행하십시오. 또는 && 중괄호에 넣으려고했지만 {

&& 및 ||에 대해 읽었습니다. 잘못된 경우 두 개의 명령을 실행하고 싶습니다.

나는 시도 ;했지만 항상 실행 됩니다. 중괄호에 넣으려고했지만 { command1; command2 }구문 오류가 발생합니다.

나는 같은 것을하고 싶다

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

인터넷에 연결되지 않은 경우에만 종료됩니다.



답변

parens를 사용하면 명령이 항상 원하는 것은 아닌 서브 쉘에 배치됩니다. 또는 중괄호를 사용하십시오.

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }

트릭은 괄호와 달리 중괄호의 마지막 명령 뒤에을 사용해야합니다 ;.

세미콜론이나 줄 바꿈이 필요한 이유

중괄호는 명령에 대한 유효한 인수입니다. 예를 들어, 다음에 대한 인수로 중괄호가 있습니다 echo.

$ echo }
}

결과적으로 쉘에 다음이 표시되면

{ command1; command2 }

쉘은 command1을 인수가없는 것으로 해석하고 command2를 문자로 구성된 하나의 인수를 갖는 것으로 해석합니다 }. 중괄호 }는 세미콜론이나 줄 바꿈 뒤에 오는 경우에만 그룹화를 닫는 것으로 해석됩니다. 위의 작업을 수행하려면

{ command1; command2; }

하부 쉘과의 차이 {...}(...)

다음 x이 10으로 설정 되어 있지만 echo명령이 실행 되기 전에 해당 설정이 잊혀져 있는지 확인하십시오 .

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

반대로 중괄호를 사용하면 설정 x=10이 기억됩니다.

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

차이점은 서브 쉘이 완료된 후에 서브 쉘의 변수 지정이 지속되지 않기 때문입니다.

선적 서류 비치

보낸 사람 man bash:

(명부)

리스트는 서브 쉘 환경에서 실행됩니다 (아래 명령 실행 환경 참조). 쉘 환경에 영향을주는 변수 할당 및 내장 명령은 명령이 완료된 후에도 유효하지 않습니다. 반환 상태는 list의 종료 상태입니다.

{목록; }

list는 단순히 현재 쉘 환경에서 실행됩니다. 리스트는 개행 또는 세미콜론으로 끝나야합니다. 이것을 그룹 명령이라고합니다. 반환 상태는 list의 종료 상태입니다. 메타 문자 (및)와 달리 {및}는 예약어이며 예약어를 인식 할 수있는 위치에서 발생해야합니다. 단어 분리를 일으키지 않기 때문에 공백이나 다른 쉘 메타 문자로 목록에서 분리해야합니다.

[공포도 추가]


답변