Linux Bash 구문 : &&, \ 및-의 의미


14

bash 명령의 끝에서 ' &&', ' \'및 ' -'은 무엇을 의미합니까?

특히, 우분투의 적성 패키지 관리자에 공개 키를 추가 해야하는 다음과 같은 라인 조합을 발견했습니다. 여기에서 사용되는 문자는 무엇입니까?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key add-&& \
    sudo apt-get 업데이트

"/"는 "\"와 동일하지 않음
Thomas

토마스 : 그의 게시물을 수정
Kyle Brandt

&&는 또한 줄 연속을 의미하기에 충분하기 때문에 여기서 백 슬래시는 필요하지 않습니다. 그러나 백 슬래시를 사용하면 가독성이 향상됩니다.
추후 공지가있을 때까지 일시 중지되었습니다.

답변:


37

"&&" 는 명령을 함께 연결하는 데 사용되므로, 이전 명령이 오류없이 종료 된 경우에만 (또는 더 정확하게는 리턴 코드 0으로 종료) 다음 명령이 실행됩니다.

줄 끝의 "\" 자체는 줄을 서로 연결하는 수단입니다. 따라서 다음 두 줄 :

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075

행이 단일 행으로 작성된 것과 동일하게 처리됩니다.

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075

"-" 는 특정 bash 함수가없는 명령 행 인수입니다. 정확하게 처리되는 방법은 실행중인 명령 (이 경우 apt-key )에 따라 다릅니다 . 상황에 따라, 일반적으로 하나 표시 "하는 데 사용되는 표준 입력이 아닌 파일에서 데이터를 읽어 "또는 " 데이터로서가 아니라 명령 행 인수로 라인의 나머지 부분을 처리합니다 ."


5
이 경우 '-'는 sudo의 매개 변수가 아니라 'apt-key'의 매개 변수입니다. 이는 키 파일 대신 'apt-key'가 파이프 ( '|')를 통해 stdin으로 오는 데이터를 사용하고 있음을 의미합니다. 열쇠로. '--output a_file_name.key'가없는 "gpg --export"옵션은 파이프 ( '|')를 통해 'apt-key'의 stdin으로 gpg stdout에서 새 키를 푸시합니다. Easy :- )
edomaur

2
으악. 반 자고있는 동안 질문에 대답하는 것입니다. 결정된.
goldPseudo

7
&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)

6

&&는 논리 AND입니다.
&&는 논리 AND 를 표현하는 방법입니다 . 즉, 양쪽이 모두 참인 경우에만 전체 표현식이 참임을 의미합니다. 논리적으로, 전체 진술 (P & Q)은 P와 Q가 모두 참일 때만 참이라고합니다.

그 결과 컴퓨터는 일반적으로 P & Q를 단락 평가로 취급 합니다. 따라서 P와 Q가 모두 참이면 전체 문장 만 참이므로 P가 거짓이면 문장 Q는 평가되지 않습니다 . 기본적으로 컴퓨터는 게으르고 (효율적), Q가없는 경우 Q를 평가하지 않아도됩니다. 이것은 논리 OR의 참이기도합니다. 이전 링크를 참조하십시오.

Bash에서 &&의 세 가지 맥락 :

1) 명령 종료 상태에서 단락 평가 사용 :
모든 명령에는 종료 상태가 있습니다. 명령에 오류가 있으면 종료 상태가 0이 아닙니다. 따라서 종료 상태가 0이 아니고 &&를 사용하여 명령을 명령문으로 연결하는 경우, 이전 명령의 종료 상태가 0 (참)이 아닌 경우 이후 명령이 평가 (실행)되지 않습니다. 이것은 단락 평가 때문입니다. 당신이 가지고 있다면 :

P && Q

P가 참이 아닌 경우 Q는 실행되지 않습니다 (P가 0 이외의 상태로 종료되면 참이 아닙니다). 다음과 같습니다 :

./configure && make

configure에 오류가 있으면 make가 실행되지 않습니다. 따라서 기본적으로 if 문에 다음과 같이 작성하는 방법이됩니다.

if ./configure ; then
   make
fi

대부분의 상황에서 0은 false이지만 종료 상태에 관한 것은 아닙니다.

2) &&는 Bash의 내장 [[]] 테스트 명령에서 사용할 수 있습니다.

&& bash [[]]의 내장 테스트 명령 안에서도 명령을 결합하는 것과 유사한 방식으로 표현식을 결합 할 수 있습니다. &&의 두 피연산자 (측면)가 모두 true 인 경우에만 전체 테스트 작업이 적용됩니다.

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 

$ a가 2와 5 사이의 정수인지 여부를 말하는 방법입니다 (2와 5는 제외).

3) 산술 평가 :

마지막으로 &&는 산술 평가에서 논리 AND로 사용될 수 있습니다. 경우 모두 0이 아닌있는 다음의 번호 (논리 AND), 그것은 다른 일을 반환, 0 반환

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0

@Kyle : && 논리식 밖에서 사용되는 &&는 "AND 제어 연산자"입니다. 비슷한 동작이지만 기술적으로 다릅니다
drAlberT

당신의 의견을 따르지 마십시오, 당신은 논리적 인 표현 밖에서 무엇을 의미합니까?
Kyle Brandt

표현에서 && 제어 연산자는 "논리적"의 평균을 가정하고 그렇지 않으면 "and"일뿐입니다. 리스트에 사용되는 "AND 제어 연산자"입니다. 논리 연산자는 표현식 내에서 산술 확장 컨텍스트에서 사용됩니다.
drAlberT

if [./configure]예에서는 대괄호를 제거해야합니다. 정답은if ./configure; then make...
Juliano

잘 잡힌 줄리아노가 업데이트됩니다. AlberT, 맨 페이지에서 제공 한 용어 이외의 다른 점이 있습니까?
Kyle Brandt

3

나는 당신이 "진짜"의미에 대한 설명으로 더 나을 것이라고 생각합니다.

  • && 는 "AND"제어 연산자입니다. 에서 bash는 사람 :
    제어 연산자 && 및 || AND 목록과 OR 목록을 각각 나타냅니다.
    AND리스트의 형식은  
        command1 && command2     
    command2는 command1이 종료 상태 0을 리턴하는 경우에만 실행됩니다.
    [..절단..]
    AND 및 OR 목록의 리턴 상태는 마지막 명령의 종료 상태입니다.
    목록에서 실행됩니다.
    
    제어 연산자 이며
    제어 기능을 수행하는 토큰. 다음 기호 중 하나입니다.
        || & &&; ;; () |
    
  • \" 이스케이프 문자 "이며 bash에서 사용할 수있는 세 가지 인용 메커니즘 중 하나입니다.
    인용
       인용은 특정 문자 나 단어가 쉘에 특수한 의미를 제거하는 데 사용됩니다.
    [..절단..]
       이스케이프 문자, 작은 따옴표 및 큰 따옴표 등 세 가지 인용 메커니즘이 있습니다.
       따옴표가없는 백 슬래시 (\)는 이스케이프 문자입니다. 다음을 제외한 다음 문자의 리터럴 값을 유지합니다. \ 쌍이 나타나고 백 슬래시 자체가 인용되지 않은 경우, \는 줄 연속으로 처리됩니다 (즉, 입력 스트림에서 제거되어 효과적으로 무시됩니다).
    [..절단..]
    백 슬래시는 $,`, ", \ 또는. 문자 중 하나가 뒤에 오는 경우에만 특별한 의미를 유지합니다.
    
    이것은 줄의 맨 끝에 이스케이프 문자 ( "\")를 넣으면 실제로 바로 뒤에 오는 새 줄 문자 (RETURN 문자)를 이스케이프하여 "줄 계속"효과를 나타냅니다. 다른 사람들은 이미 답변에서 설명했습니다
  • 일부 명령이 매개 변수로 허용하는 대시 문자 " - "는 쉘 특수 문자 나 연산자가 아닌 규칙입니다. 이미 지적했듯이 표준 I / O 스트림에 대한 일종의 장소 표시 자입니다. 프로그램에 따라 stdin (표준 입력) 또는 stdout (표준 출력)을 유지할 수 있습니다.

내 2 센트


1
아마도 tl; dr의 경우가 될 것입니다. 맨 페이지의 거대한 덩어리를 붙여 넣는 것 (현상 그대로)은 아마도 OP를 위협 할 것입니다.
rodjek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.