리디렉션과 함께 사용할 때 nohup
올바른 순서는 무엇입니까 ?&
다른 명령이 올바르지 않은 이유는 무엇입니까?
예를 들어,
$ nohup firefox& &> /dev/null
$ nohup firefox &> /dev/null &
리디렉션 및 &
.
다른 예시,
$ nohup sleep 1000 & &>/dev/null
으로 리디렉션되지 않지만 /dev/null
여전히 으로 리디렉션 중입니다 ./nohup.out
.
답변1
섹션부터 시작하겠습니다.쉘 문법매뉴얼 페이지에서 bash
:
간단한 명령
ㅏ 간단한 명령일련의 선택적 변수 할당으로, 그 뒤에 공백으로 구분된 단어와리디렉션, 다음에 의해 종료됩니다.제어 연산자.
그래서리디렉션( &>/dev/null
)가 먼저 나타난 다음제어 연산자다음과 같습니다( &
).
편집하다:답변을 완성하기 위해 nohup
첫 번째 부분은 다음과 같습니다.간단한 명령. 에서는 특별한 의미가 없습니다 bash
.
정확히 귀하의 예입니다(이것은 /dev/null
단지 복잡하다는 점을 제외하면):
jakuje@E6430:/tmp$ rm nohup.out out
jakuje@E6430:/tmp$ nohup sleep 1 & &>out
[1] 10876
nohup: ignoring input and appending output to ‘nohup.out’
[1]+ Done nohup sleep 1
jakuje@E6430:/tmp$ cat nohup.out # empty
jakuje@E6430:/tmp$ cat out # empty
jakuje@E6430:/tmp$ rm nohup.out
jakuje@E6430:/tmp$ nohup sleep 1 &>out &
[1] 10882
[1]+ Done nohup sleep 1 &> out
jakuje@E6430:/tmp$ cat nohup.out # no file
cat: nohup.out: No such file or directory
jakuje@E6430:/tmp$ cat out # output of nohup
nohup: ignoring input
답변2
이 nohup
명령은 이 예에서 실제로 실행하는 명령입니다. 단어가 firefox
설명되지 않음쉘을 통해명령으로서 단순히 인수로 전달됩니다 nohup
. nohup
명령이 해당 인수로 수행하는 작업은 "쉘 독립적"입니다.
물론, nohup
그 인수를 받아들이고 명령으로 실행하는 것이 전부입니다.
요점은셸의 관점에서 실제로 수행하는 작업은 출력을 리디렉션하는 것입니다 nohup
.아니요출력 firefox
.
그러나 nohup
자체 출력이 지정되는 위치에 따라 실행되는 명령의 출력에 대해 다른 작업이 수행됩니다. ~에서POSIX 사양nohup
(강조하다):
표준 출력이 터미널인 경우, 모든 출력은 다음과 같이 지정됩니다.유용표준 출력은 현재 디렉터리의 nohup.out 파일 끝에 추가되어야 합니다. 추가를 위해 nohup.out을 생성하거나 열 수 없는 경우 출력은 HOME 환경 변수로 지정된 디렉터리에 있는 nohup.out 파일 끝에 추가되어야 합니다. ...
표준 오류가 터미널이고표준 출력은 열려 있지만 터미널은 열려 있지 않습니다., 이름 지정 유틸리티가 표준 오류에 기록한 모든 출력은 표준 출력과 동일한 열린 파일 설명으로 리디렉션되어야 합니다. ...
따라서 고유한 마법으로 인해 nohup
다음 명령을 실행하면 리디렉션이 예상대로 작동합니다.
nohup utility >/dev/null &
stderr
두 가지를 모두 리디렉션할 필요 는 없으며 stdout
이 명령은 다음을 nohup
리디렉션하므로stderr
유용nohup
자신의 출력이 어디로 향하는지에 따라 다릅니다 . (휴대용이 아니라는 것은 말할 것도 없습니다 &>
.)
귀하의 입력에는 이식성 문제도 있습니다. stdin
터미널에 연결되어 있으므로 정확히 무슨 일이 일어나는지는 구현에 따라 다릅니다 . (바라보다nohup
POSIX 사양의 "기본 사항"에 있는 참고 사항.) 대신 다음을 사용하는 것이 더 좋습니다.
nohup firefox >/dev/null </dev/null &
댓글에서 이미 언급했듯이 nohup
어떤 상황에서도 배경 뒤에 리디렉션을 넣어서는 안 됩니다 &
.