'&&'와 ';'사이에 차이점이 있습니까? 표준 BASH 터미널의 기호?


56

그들은 기호를 따르는 다른 명령으로 시작하도록 BASH에 신호를 보내는 것처럼 보이지만 뚜렷한 차이점이 있습니까?

답변:


75

이 줄로 :

command1 && command2

command2는 command1이 종료 상태를 0으로 반환하는 경우에만 실행되지만 다음 줄에서는 다음과 같이 실행됩니다.

command1 ; command2

command1과 command2는 모두 관계없이 실행됩니다. 세미콜론을 사용하면 한 줄에 많은 명령을 입력 할 수 있습니다.


1
흥미 롭습니다! 나는 그것이 더 편안한 방법이라고 생각했다. 감사합니다!

42

당신은 자신을 위해 차이를 시도 할 수 있습니다 :

  1. ls /invalid/path && echo "hello!"
    / invalid / path가 존재하지 않기 때문에 ls는 디렉토리 목록을 보여줄 수 없습니다. "ls : / invalid / path : No such file or directory"오류 메시지와 함께 실패합니다. 하반기 명령이 ( "안녕하세요!"에코)이되고 도 실행되지 않습니다 상반기에 실패하기 때문이다.

  2. ls /invalid/path ; echo "hello!"
    이전과 동일한 오류 메시지가 나타나지만 이번에는 두 번째 부분이 실행됩니다 !
    ls : / invalid / path : 그런 파일이나 디렉토리가 없습니다
    hello!

이것이 왜 유용한가요?
archive.tar.gz라는 파일을 추출한다고 가정하면
명령을 사용할 수 있습니다 tar zxvf archive.tar.gz && rm archive.tar.gz.
어떤 이유로 든 아카이브 추출에 실패하면 두 번째 부분이 실행되지 않습니다! 다시 시도 할 수 있습니다.

사용하면; 같은 상황에서 보관 파일이 삭제되고 다시 시도 할 수 없습니다.


8

&&is AND, 즉 두 번째 명령은 첫 번째 명령이 true를 반환 한 경우에만 실행됩니다 (오류 없음).


1
&&는 "다음"( "and"가 아님)입니다 ... 내 답변보기
Peter.O

2
@fred 나는 단락 평가를 가진 "and" 라고 말하고 싶습니다 . 첫 번째 부분이 사실이 아닌 경우 총 결과가 거짓이어야한다는 것을 알고 있으므로 두 번째 부분을 건너 뜁니다. 그러나 그것을 "그때"로 생각하는 것이이 맥락에서 거의 큰 차이를 만들지 않는다는 데 동의합니다.
jg-faustus

2
@fred 개념적으로 이해하는 것이 더 쉽지만, 나는 당신의 진술에 동의하지 않습니다. 아이디어는 함께하는 것이 단순히 어떤 AND 첫 번째가 동일한 경우 실행 두 번째 매개 변수는 무관하게 false등 기본 코드는 첫 번째가 무엇인지 알고까지 2 매개 변수의 평가를 연기하기 위해 최적화됩니다.
Ward Muylaert

2
@fred 나는 그 예제가 어떤 포인트를 만들고 있는지 잘 모르겠습니다. &&이진 연산자, 함수입니다. 유일한 "특별한 것"은 그것이 어쨌든 이러한 표기법의 대부분의 연산자 인 표준 표기법이고 두 번째 피연산자의 실행이 지연된다는 것입니다. 지연된 실행은 실제로이 문맥에서 개념적으로 if진술 볼 수있는 것으로 사용될 수있는 능력을 제공 하지만, 원래 의도 된 용도가 실제 진술 의 조건 내에 있다는 사실에서 벗어나지 않습니다 if. 여기서 사용하는 것은 실제로 "해킹"에 가깝습니다.
Ward Muylaert

3
@fred 물론 이것은 삼항 연산자가 아니며, 단지 두 연산의 연속입니다 a && b || c = (a && b) || c. 간단한 평가 순서. 거기에는 미스터리가 없습니다. 일반적인 함수처럼 작성하면 간단하게 보일 것 or(and(a, b), c)입니다. 이 논리는 내 동일 if하기 때문에 바로 명령 줄로를 입력 할 때뿐만 아니라 조건 &&||있는 사업자 들은 피연산자 2 개를 사용하여 그들은 서로를 반환.
Ward Muylaert 님

8

업데이트 : 가능한 트랩을 높이기 위해 스크립트로 추가했습니다.

아무도 "||"에 대해 언급하지 않았으므로

Update2 : 여기에서 중요한 단어 다시 쓰기
&&는 "true"에 응답하는 "if"문의 "then"과 같습니다.

|| 되는 NOT 에 "만약"한 Statment ..의 "다른"좋아
||를 "false"에 응답하는 "if"문의 "then"과 같습니다.

더 구체적으로, && 테스트는 $? 가장 최근에 실행 된 이전 명령문 의 값을 리턴 하고 && 바로 다음의 명령문 또는 서브 쉘에 제어를 전달합니다. $? 사실이다.

|| 비슷하며 종종 && 문 다음에 표시되지만 가장 최근에 실행 된 이전 문 에서 잘못된 반환 값 ($?)을 테스트 합니다 ... NB! Nota Bene! 잘 결정하십시오! .... predecing 문이 true 일 것으로 예상 될 때 false를 다시 발생시키는 && 문이면 || 같은 라인에 둘을 혼합하면 위험 할 수 있습니다.

내가하려고하는 요점은 내가 저지른 실수와 관련이 있습니다. 즉 :
## [[조건]] && A || B는
되어 있지 는 C / C ++ 스타일의 원처럼 행동하지 않습니다. 즉 :
// (조건)? A : B
"A"의 "예기치 않은"결과의 예는 아래 스크립트를 참조하십시오.

기본 테스트와 && 및 || 성명서는 모두 같은 줄에 있어야합니다 ...


이 스크립트를 실행하여 && 및 ||를 사용할 때 문제가 발생할 수있는 위치를 확인하십시오. 가장 최근에 실행 된 문은 당신이 기대하는 하나가 될 수 없습니다 ..

[[조건]] && 에코 안녕하세요 || echo Goodbye ....
잘 구성된 에코가 true를 반환하기 때문에 일반적으로 안전 합니다.
그러나 종료되지 않는 파일에 액세스하는 것은 어떻습니까?

#!/bin/bash
#
# "as expected" return codes" means: expected to behave like a normal AND / OR  contition test
#
if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal)
echo
echo 'test 1: All return codes are "as expected"'
echo  ======
 ((1==1)) && echo  " ((1==1)) rc=$? ..&&.. condition is true" || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && echo "  \$0  0   rc=$? ..&&.. condition is true" || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && echo  " ((1!=1)) rc=$? ..&&.. condition is true" || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && echo "  \$0  1   rc=$? ..&&.. condition is true" || echo "  \$0  1   rc=$? ..||.. condition is false"
echo
echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair' 
echo  ======
 ((1==1)) && (echo  " ((1==1)) rc=$? ..&&.. condition is true"; $0 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && (echo "  \$0  0   rc=$? ..&&.. condition is true"; $0 2)  || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && (echo "  \$0  1   rc=$? ..&&.. condition is true"; $0 4)  || echo "  \$0  1   rc=$? ..||.. condition is false"
echo
echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes'
echo  ======
 ((1==1)) || echo  " ((1==1)) rc=$? ..||.. condition is true" && echo  " ((1==1)) rc=$? ..&&.. condition is false"
  $0  0   || echo "  \$0  0   rc=$? ..||.. condition is true" && echo "  \$0  0   rc=$? ..&&.. condition is false"
 ((1!=1)) || echo  " ((1!=1)) rc=$? ..||.. condition is true" && echo  " ((1!=1)) rc=$? ..&&.. condition is false"
  $0  1   || echo "  \$0  1   rc=$? ..||.. condition is true" && echo "  \$0  1   rc=$? ..&&.. condition is false"
echo
echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair' 
echo  ======
 ((1==1)) && (echo  " ((1==1)) rc=$? ..&&.. condition is true"; $0 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && (echo "  \$0  0   rc=$? ..&&.. condition is true"; $0 2)  || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && (echo "  \$0  1   rc=$? ..&&.. condition is true"; $0 4)  || echo "  \$0  1   rc=$? ..||.. condition is false"

exit 


1

시험

거짓 && 에코 "hello"

거짓; 에코 "안녕하세요"

차이점을보십시오


0

이후의 명령 (스크립트의 경우 기능) &&은 첫 번째 명령의 RETVAL (스크립트의 경우 기능)에 따라 실행됩니다. 성공하면 첫 번째 명령이 0 값을 리턴하도록합니다. 반환 값을 확인하여 추가 명령을 실행할 수 있습니다.

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