어느 것이 더 낫습니까 : using; 또는 && 한 줄에 여러 명령을 실행하려면?


427

튜토리얼과 사용법에서 종종 명령이 결합 된 것을 볼 수 있습니다. 예를 들어

sudo apt-get update && sudo apt-get install pyrenamer

이 네 가지 커넥터 것 같다 : &, &&, ||;. 하지만 & 커넥터가 나에게 분명하다 (이것은 배경으로 프로세스를 전송하고 사용할 수있는 단말기가 잎),이 차이가 사이에 무엇인지 분명하지 않다 &&;. 그리고 ||카야의 의견 이 올 때까지 나는 몰랐습니다 .

다음 질문은 두 커넥터의 차이점을 다루지 만 대부분 주석에서 그렇게합니다.

다음은 여러 가지 관련 질문입니다.

  1. 차이점은 무엇이며 ;그리고 &&?
  2. 언제 각각 사용해야 합니까? 몇 가지 사용 사례를 보는 것이 좋을 것입니다. 명령을 실행하고 컴퓨터를 종료 한 후 어떤 커넥터를 선택해야합니까?
  3. 그들의 장점위험 은 무엇입니까 ? Robie Basak 은 예를 들어 명령 체인의 첫 번째 요소가 실패하면 같은 명령 이 파괴적인 결과를 초래할 수 있다고이 답변 에 대한 의견에서 언급했습니다 cd /somewhere_else; rm -Rf *.
  4. 관련이 있다면 어디에서 왔습니까?

7
다른 커넥터가 있습니다 . 첫 번째 커넥터가 0이 아닌 (성공하지 않은) 상태로 종료 된 경우 두 번째 명령 만 실행한다는 점 ||&&제외하고 는 동일 합니다.
Kaya

4
또한 스크립트를로 실행 set -e하면 모든 명령이에 연결된 것처럼 실패시 스크립트가 중지됩니다 &&.
choroba


3
Qn 4에 아무도 답변하지 않았습니다 ... && 및 || C 프로그래밍 언어에서 영감을 얻었습니다. (x && y)의 경우 x가 false로 평가되면 전체 표현식은 false 여야하므로 컴파일러는 값 비싼 경우 y의 평가를 최적화 할 수 있습니다. 현대의 C 및 C ++ 표준에는 실제로이 최적화 가 필요 하므로 프로그램은 x가 false이면 y가 평가되지 않는다고 안전하게 가정 할 수 있습니다. 예를 들어, (ptr && ptr-> days> 31)은 ptr이 null 인 경우에도 충돌하지 않습니다. 또한 C에서 명령문은; 같은 줄에 다른 진술이 있는지 여부에 관계없이.
Kevin

답변:


771

컨닝 지:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

19
물론 A & B &: : 백그라운드에서 A를 실행 한 다음 백그라운드에서 B를 실행하고 (성공 여부에 관계없이) 제어를 셸로 되돌립니다. 이것은 종종 두 프로세스를 동시에 실행하는 것과 거의 동일하게 작동합니다.
제한 속죄

4
말할 수 있습니까 : 백그라운드에서 a를 실행하고 작업 한 경우에만 백그라운드에서 b를 실행합니까? (
&&

14
@ user230910 : 그럴 것입니다 (A && B) &.
leftaroundabout

5
이에 대한 권위있는 문서를 참조 할 수 있습니까?
Jaime Hablutzel

@Jack Cronjob에서 실행될 때이 규칙을 따르지 않는 이유는 무엇입니까? 파이썬 파일의 경우
CodeGuru

77

&&첫 번째 명령이 상태 0 (종료)으로 종료 된 경우에만 두 번째 명령을 실행합니다. ;첫 번째 명령이 0이 아닌 상태로 종료 되더라도 두 명령을 모두 실행합니다.

의 예 &&는 다음과 같이 해석 할 수 있습니다.

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

감사. 다른 하위 질문을 쉽게 구분할 수 있도록 질문을 업데이트했습니다.
don.joey

5
@Private : ;두 번째 명령이 이전 명령이 필요하지 않은 경우 사용해야 합니다.
choroba

31

를 사용 ;하면 첫 번째 명령의 성공 여부에 관계없이 명령이 실행됩니다.

사용하여 &&첫 번째 명령이 성공적으로 실행에만 두번째 명령 (상태 0)을 실행합니다.

둘 다 다른 관점에서 사용됩니다. 더 긴 프로세스와 마찬가지로 설치를 위해 컴파일하고 설치해야한다고 말합니다. 당신은해야합니다 make && make install. 따라서 설치는 make성공한 경우에만 실행됩니다 .

따라서 종속 명령의 경우 사용해야합니다 &&

Wash bash 또는 독립적 인 명령을 사용하는 명령 사용 ;

따라서 컴퓨터를 종료하려는 경우 첫 번째 작업이 실패 ;했지만 첫 번째 작업을 성공적으로 완료하려면 종료 사용을 시작하십시오.&&


14

a ; ba의 종료 상태에 관계없이 b를 실행합니다. a && b성공한 경우에만 b를 실행합니다.

이것은 처음 세 가지 질문에 대답하기에 충분하고 충분합니다. 특히, 2는 너무 넓고 "하나의"정답을 줄 수 없습니다. 최선의 방법은 사례별로 결정하는 것입니다.

네 번째 질문 은 Bash 구문 입니다.

어느 쪽을 사용하더라도 본질적인 위험은 없습니다. 다시, 위의 정의로 충분합니다. 성공하지 못하면 의도하지 않은 효과가있을 &&때 작성한다는 의미입니다 . 추가 규칙이나 설명이 필요하지 않습니다 (IMHO).ba


1

에이; B # A의 성공 여부에 관계없이 A를 실행 한 다음 B를 실행합니다.

A && B # A가 성공한 경우에만 B를 실행

|| B # A가 실패한 경우에만 B를 실행하십시오.

A & # 백그라운드에서 A를 실행합니다.

매우 좋은 경험 법칙. 어떤 경우에는 서브 쉘에서 이러한 명령을 사용하는 것이 단일 단위로 간주되거나 일부 작업 결과를 현재 쉘과 결합하고 싶지 않을 때 의미가 있습니다.

예 :

-두 명령의 출력을 연결합니다.

(ls foo; ls bar) > single-result.txt

쉘의 현재 디렉토리를 변경하지 않고 디렉토리로 이동하여 거기서 명령을 수행하십시오.

(cd target-directory && jar -xf ../my-jar)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.