명령 끝에서 &의 의미는 무엇입니까?


12

시작 스크립트 줄이 있습니다.

pyprogramm >> /dev/null  2>&1 &

의미 :

>> /dev/null - redirect stdout to null device
2>&1 - redirect stderr to stdout (that is redirected to null device)

그러나 마지막 &의미는 무엇입니까?

답변:


16

& 터미네이터 란 무엇입니까?

&명령 끝에 있는 후행 연산자는 명령을 백그라운드에 넣는 데 사용됩니다. 이것은 실제로 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 |의 약어입니다. 표준 오류를 표준 출력으로 암시 적으로 재지 정하는 것은 명령으로 지정된 재 지정 후에 수행됩니다.


2
&출력 숨기기 에 대해 말하는 내용 이 올바르지 않습니다. 인용 한 표준의 단락은 출력이 아니라 입력에 대해 말합니다 . 작업 제어가 사용 가능하거나 사용 불가능한 이유는 tty에서 읽으려는 백그라운드 프로세스가 일시 중단되기 때문입니다. 이 시점에서 작업 제어를 사용하여 대기중인 입력을 제공하기 위해 포 그라운드에 배치해야합니다. 작업 제어 없이는이 모든 작업을 수행 할 수 없으므로 작업 제어가 비활성화 된 경우 stdin을 리디렉션 하거나 이와 동등한 작업을 수행해야합니다 . /dev/null
kasperd

나는 당신의 편집에서 실수를 발견했습니다. 한 곳에서 당신은 당신이 서면으로 비활성화해야 할 곳에 썼다.
kasperd

@kasperd 그래, 나는 그것을 발견했을 때 POSIX 페이지를 다시 읽고있었습니다. 이미 수정되었습니다. 다른 수정이 필요한 경우 알려주세요. 감사합니다 :)
Sergiy Kolodyazhnyy

3

백그라운드에서 명령을 실행한다는 의미입니다. 호출 된 명령은 호출 된 명령이 완료 될 때까지 차단하지 않고 계속됩니다.


0

&이 스크립트의 제어권을 운영 체제로 반환하지만 nohup전체 실행을 직접 보내는 것이 아니라 백그라운드로 응답을 보냈습니다.

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