쉘 명령에서“&&”의 목적은 무엇입니까?


답변:


398

&&이전 명령이 성공적으로 완료되었는지 여부에 따라 무언가를 수행 할 수 있습니다 do_something && do_something_else_that_depended_on_something.


391

또한 ||논리 또는 논리가 있으며 ;이전 명령에서 발생한 일을 신경 쓰지 않는 구분 기호 이기도 합니다.

$ false || echo "Oops, fail"
Oops, fail

$ true || echo "Will not be printed"
$  

$ true && echo "Things went well"
Things went well

$ false && echo "Will not be printed"
$

$ false ; echo "This will always run"
This will always run

이에 대한 자세한 내용은 Bash 매뉴얼 의 명령 목록 에서 확인할 수 있습니다 .


5
을 추가하고 싶을 수도 있습니다 false && echo "Will not be printed".
MTSan

112

명령 줄-목적은 &&무엇입니까?

셸에서 볼 때

$ command one && command two

의도는 &&첫 번째 명령이 성공한 경우에만 뒤에 오는 명령을 실행하는 것 입니다. 이것은 Posix 쉘의 관용적이며 Bash에서만 찾을 수는 없습니다.

첫 번째 프로세스가 실패하면 두 번째 프로세스가 실행되지 않도록합니다.

내가 "의도"라는 단어를 사용했음을 알 수 있습니다. 그 이유는 그만한 이유입니다. 모든 프로그램이 동일한 동작을 갖는 것은 아니므로, 이것이 작동하려면 프로그램이 "실패"로 간주하는 내용과 설명서 및 필요한 경우 소스 코드를 읽고 프로그램을 처리하는 방법을 이해해야합니다.

쉘은 true의 경우 리턴 값 0을, false의 다른 양수를 고려

프로그램 은 종료시 신호 를 반환합니다 . 성공적으로 종료되면 0을, 그렇지 않으면 0보다 커야합니다. 이를 통해 프로세스 간 통신량이 제한됩니다.

&&라고도 AND_IF에서 POSIX 쉘 문법 의 일부 and_or목록 도 포함 명령, ||있는 OR_IF비슷한 의미를 가진.

설명서에서 인용 된 문법 기호 :

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */

그리고 Grammar (문서에서 인용)는 AND_IFs ( &&) 및 / 또는 OR_IFs ( ||)가 함께 and_or재귀 적으로 정의 될 수 있음 을 보여줍니다 .

and_or           :                         pipeline
                 | and_or AND_IF linebreak pipeline
                 | and_or OR_IF  linebreak pipeline

두 연산자 모두 우선 순위가 동일하며 왼쪽에서 오른쪽으로 평가됩니다 (왼쪽 연결). 문서에서 말한 것처럼 :

AND-OR목록 사업자에 의해 분리 된 하나 개 이상의 파이프 라인의 서열이다 "&&"하고 "||".

목록은 하나 이상의 시퀀스이다 AND-OR 목록은 운영자에 의해 분리 ';'하고 '&'선택적으로 종료 ';', '&'또는.

연산자 "&&""||"같은 우선 순위를 가지며 왼쪽 연관성 평가되어야한다. 예를 들어, 다음 명령은 모두 표준 출력에 대한 막대만을 작성합니다.

$ false && echo foo || echo bar
$ true || echo foo && echo bar
  1. 첫 번째 경우, false는 다음 상태로 종료되는 명령입니다. 1

    $ false
    $ echo $?
    1

    이는 echo foo작동하지 않는 것을 의미 합니다 (즉, 단락 echo foo). 그런 다음 명령 echo bar이 실행됩니다.

  2. 두 번째 경우, true는 코드로 종료됩니다. 0

    $ true
    $ echo $?
    0

    따라서 echo foo실행되지 않은 다음 echo bar실행됩니다.


31

'&&'의 일반적인 사용법은 autotools로 소프트웨어를 컴파일하는 것입니다. 예를 들면 다음과 같습니다.

./configure --prefix=/usr && make && sudo make install

기본적으로 configure가 성공하면 컴파일을 위해 make가 실행되고, 성공하면 make가 root로 실행되어 프로그램을 설치합니다. 나는 일이 잘 될 것이라고 확신 할 때 이것을 사용하며, 진행 상황을 '모니터'하지 않고 stackoverflow를 보는 것과 같은 다른 중요한 일을 할 수 있습니다.

때때로 나는 정말로 쫓겨 난다 ...

tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf

예를 들어 처음부터 리눅스를 만들 때이 작업을 수행합니다.


2
REPL에는 좋지만 스크립트의 set -o errexit경우 Bash를 선호 합니다.
Franklin Yu

19

&&문자열을 함께 명령합니다. 후속 명령은 이전 명령이 성공한 경우에만 실행됩니다.

마찬가지로 ||앞의 명령이 실패 할 경우 연속 명령을 실행할 수 있습니다.

Bash Shell Programming을 참조하십시오 .


8

예를보십시오 :

mkdir test && echo "Something" > test/file

쉘은 디렉토리를 생성하려고 시도하고 test, 성공한 경우에만 그 안에 파일을 생성하려고 시도합니다.

따라서 단계 중 하나가 실패하면 일련의 단계를 중단 할 수 있습니다.


8

첫 번째 문이 성공적으로 끝나면 두 번째 문을 실행해야합니다. if 문처럼 :

 if (1 == 1 && 2 == 2)
  echo "test;"

첫 번째는 1 == 1이면 시도하고, 참이면 2 == 2인지 확인합니다.


1
사용자가 질문에 걸림돌이 된 이유를 설명 할 수 있습니까?
user3243242

1
@ user3243242 그것은 틀린 것이 아닙니다. 단지 사용법을 설명하기위한 열악한 예입니다&&
dan

if테스트가 bash에서 어떻게 작동 하는지에 대한 훌륭한 통찰력 입니다. 나는 그것을 일련의 비교 명령처럼 생각하지 않았으며, 실패했을 때 깨졌습니다. 그래서 당신은 내
공감대를

1
결과적으로 ||명령 중 하나가 성공할 때까지 명령을 체인으로 연결 eei || leu || uie || echo prout3 || echo "never executed"
하여을

7

command_1 && command_2: command_1이 성공적으로 실행 된 경우에만 command_2를 실행하십시오.

command_1 || command_2: command_1이 성공적으로 실행되지 않은 경우에만 command_2를 실행하십시오.

에서, '가'조건 등 주류 프로그래밍 언어에서 실행되는 방법과 유사한 온도 if (condition_1 && condition_2){...}condition_2 condition_1 경우 생략한다 false이상에서 if (condition_1 || condition_2){...}condition_1 경우 condition_2 생략한다 true. 참조 : 코딩에 사용하는 것과 동일한 트릭입니다. :)


나는 '정확하게 반대'라는 것이 무엇을 의미하는지 모르지만 $ echo '1'|| echo '2'는 '1'만 인쇄합니다. 그리고 $ wrong_command || echo '2'는 오류 메시지를 인쇄하고 다음 줄에 '2'를 인쇄합니다. 당신이 그것에 대해 잘못 생각하는 것에 대해 조금 더 설명해 주시겠습니까?
Xiaonin Li 2016 년

호 친구, 나는 어제 확실히 너무 피곤했다. 죄송합니다 그, 그것은 내게 만했다 / 나는 당신이 내가 upvote에 원하는 경우에 응답 당신의 편집 뭔가가 필요 (난 할 수 있도록 지금 유래 편집을 요청, 답변 0을 만들 수 없습니다)
Arount

@Arount, 걱정하지 않아도 괜찮습니다. 방금 수정 사항을 제출했습니다. 이제 투표를 제거 할 수 있습니까?
Xiaonin Li

그래, 다시, 미안, 정말
Arount

0
####################### && or (Logical AND) ######################
first_command="1"
two_command="2"

if [[ ($first_command == 1) && ($two_command == 2)]];then
 echo "Equal"
fi

프로그램이 명령을 확인하면 프로그램은 종료 코드라는 숫자를 작성하고, 두 조건이 모두 true이면 종료 코드는 0이고, 그렇지 않으면 종료 코드는 양수입니다. 종료 코드가 영 (0)으로 생성 된 경우 Equal을 표시 할 때만 두 조건이 모두 참임을 의미합니다.


stackoverflow에 오신 것을 환영합니다. 여기에 게시하기 전에 코드 스 니펫이 작동하는지 확인하십시오. 당신은 그것을 수정해야합니다if [[ ($first_command == "1") && ($two_command == "2") ]];then echo "Equal"; fi
Zheng Qu

1
귀하의 명령에 대해 @ZhengQu에게 감사드립니다.
아민
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.