`nohup`, `&` 및 리디렉션 사이에서 순서를 지정하시겠습니까?

`nohup`, `&` 및 리디렉션 사이에서 순서를 지정하시겠습니까?

리디렉션과 함께 사용할 때 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터미널에 연결되어 있으므로 정확히 무슨 일이 일어나는지는 구현에 따라 다릅니다 . (바라보다nohupPOSIX 사양의 "기본 사항"에 있는 참고 사항.) 대신 다음을 사용하는 것이 더 좋습니다.

nohup firefox >/dev/null </dev/null &

댓글에서 이미 언급했듯이 nohup어떤 상황에서도 배경 뒤에 리디렉션을 넣어서는 안 됩니다 &.

관련 정보