답변:
&
명령 끝에 있는 후행 연산자는 명령을 백그라운드에 넣는 데 사용됩니다. 이것은 실제로 POSIX 표준으로 지정된 표준 구문입니다 .
비동기 목록
제어 연산자 ( '&')가 명령을 종료하면, 쉘은 서브 쉘에서 명령을 비동기 적으로 실행해야합니다. 이것은 쉘이 다음 명령을 실행하기 전에 명령이 완료되기를 기다리지 않아야 함을 의미합니다.
백그라운드에서 명령을 실행하기위한 형식은 다음과 같습니다.
command1 & [command2 & ...]
백그라운드 명령의 목적은 스크립트에서 주 쉘없이 또는 명령을 기다리는 대화식 쉘에서 명령을 실행하는 것입니다.이 명령은 다른 명령의 실행을 차단하고 사용자가 기다리는 데 불편을줍니다. 장기 실행 명령 을 시작하는 데 편리 하지만 현재 쉘에서 작업을 계속해야합니다. 짐작할 수 있듯이 이것은 멀티탭 터미널 에뮬레이터가 없었던 시점에서 시작되었지만 터미널은 컴퓨터 자체에 연결된 실제 물리적 하드웨어였습니다.
정의에서 볼 수 있듯이 &
명령 목록의 명령 종결 자 역할을합니다 ;
. 특정 예에서는 pyprogramm >> /dev/null 2>&1 &
목록에 하나의 명령 만 있습니다.
더 일반적으로,
echo Hello ; echo World ;
과
echo Hello & echo World &
;
및 &
연산자로 종료 된 목록의 두 가지 예입니다 . 한 가지 차이점은 작업 제어가 사용 불가능한 경우 &
종료 된 목록에 입력이 연결된다는 것입니다 /dev/null
.
작업 제어가 사용 불가능한 경우 (set, -m 참조), 명시 적 경로 재 지정이 수행되기 전에 비동기 목록에 대한 표준 입력은 / dev / null과 동일한 특성을 가진 파일에 지정되는 것으로 간주됩니다. 작업 제어가 활성화 된 경우에는 발생하지 않습니다. 모든 경우에 표준 입력의 명시 적 리디렉션은이 활동을 무시해야합니다.
그러나 순차 목록에서 stdin
명시적인 리디렉션이없는 경우 각 명령은 여전히 터미널에 연결되어 있습니다.
또한 앞에서 언급 한 정의 &
에서 서브 쉘에서 명령을 실행합니다. 대조적으로, ;
종료 된리스트는 현재 쉘에서 실행됩니다. 종료 상태에도 차이가 있습니다. 에 대한 &
표준 말한다 :
비동기리스트의 종료 상태는 0이어야한다.
여러 명령을 백그라운드로 배치하려는 경우에 중요합니다. 스크립트 나 명령을 작성할 때 실패했는지 여부에 관계없이 명령을 선택해야하거나 0이 아닌 (오류) 종료 상태를 처리 할 방법을 찾아야합니다. 특정 예제 pyprogramm >> /dev/null 2>&1 &
에서 백그라운드 에서 실행하면 실패했는지 여부를 나타내는 방법이 있어야하지만 사용 2>&1
하는 것으로 판단하면 리디렉션하여 오류 출력을 숨기고 스크립트가 실패하지 않아야한다고 가정합니다.
반대로, ;
종료 상태는 다음과 같이 정의됩니다.
순차 목록의 종료 상태는 목록에서 마지막 명령의 종료 상태입니다.
다시 말하지만, 명령 줄에 순차적 인 명령 목록을 작성하는 방법과 목록의 일부 명령이 실패한 경우 처리 할 방법에 영향을 미칩니다.
이 모든 Bourne의이 같은 쉘 의미하는 POSIX 정의 수단이라는 사실 bash
, dash
그리고 ksh
이를 지원해야합니다.
&
리디렉션에서 &
명령 종료 기와 다릅니다 . 파일 디스크립터 객체를 복제 (복사)하는 것을 의미합니다. 출력 리디렉션에서 정확히 무엇을 의미합니까?를 참조하십시오 .
에서는 bash
도있다 |&
연산자 (앰퍼샌드 파이프 사이의 공간에 유의하지 않음). 에서 bash는 수동 :
| &를 사용하면 표준 출력 외에 명령의 표준 오류가 파이프를 통해 command2의 표준 입력에 연결됩니다. 2> & 1 |의 약어입니다. 표준 오류를 표준 출력으로 암시 적으로 재지 정하는 것은 명령으로 지정된 재 지정 후에 수행됩니다.
&
출력 숨기기 에 대해 말하는 내용 이 올바르지 않습니다. 인용 한 표준의 단락은 출력이 아니라 입력에 대해 말합니다 . 작업 제어가 사용 가능하거나 사용 불가능한 이유는 tty에서 읽으려는 백그라운드 프로세스가 일시 중단되기 때문입니다. 이 시점에서 작업 제어를 사용하여 대기중인 입력을 제공하기 위해 포 그라운드에 배치해야합니다. 작업 제어 없이는이 모든 작업을 수행 할 수 없으므로 작업 제어가 비활성화 된 경우 stdin을 리디렉션 하거나 이와 동등한 작업을 수행해야합니다 ./dev/null