Ask Ubuntu에서 다음을 제안 하는 답변 을 편집했습니다.
nohup gedit >& /dev/null &
그들이 실제로 의미했을 때
nohup gedit &> /dev/null &
후자는 stderr 및 stdout을 모두로 올바르게 리디렉션합니다 /dev/null. 전자가 파일을 만들 &거나 다른 경우와 마찬가지로 오류를 줄 것으로 기대했습니다.
$ echo "foo" >&
bash: syntax error near unexpected token `newline'
대신, 전자와 정확히 같은 방식으로 작동하는 것 같습니다. gedit창이 나타나고 오류 메시지가 인쇄되지 않습니다.
또한 이것은 쉘마다 다릅니다.
-
bash(4.2.45 (1)-릴리스),zsh(5.0.2),csh(deb 패키지 버전 :tcsh20110502-2) 및 (6.18.01) : 위에서 설명한대로 작동하며 오류 메시지가없고 파일이 생성되지 않습니다. -
dash(0.5.7-3) :$ nohup gedit >& /dev/null & $ dash: 2: Syntax error: Bad fd number -
ksh(93u + 2012-08-01) : 실패하지만 창이 나타나지1223않더라도 프로세스가 분명히 시작됩니다 ( )gedit.$ nohup gedit >& /dev/null & [1] 1223 $ ksh: /dev/null: bad file unit number -
fish(2.0.0) :> nohup gedit >& /dev/null & fish: Requested redirection to something that is not a file descriptor /dev/null nohup gedit >& /dev/null & ^
그렇다면 왜 일부 쉘에서는이 명령이 단순히 오류없이 생성되고 출력 파일이 생성되지 않고 다른 쉘에서는 실패합니까? 이란 무엇입니까 >&의 외관상 특별한 경우에 일이 nohup? 나는 그것이 >& /dev/null해석되는 것으로 추측 >&/dev/null하지만 왜이 쉘에서 공간이 오류를 일으키지 않습니까?
답변
nohup gedit &> /dev/null
POSIX 구문이며 다음과 같습니다.
nohup gedit &
> /dev/null
nohup gedit백그라운드에서 실행 된 다음 > /dev/null명령을 실행하지 않고 리디렉션을 수행합니다.
nohup gedit >& /dev/null
POSIX 구문이 아니며 cshstdout 및 stderr을 / dev / null로 리디렉션 하는 방법입니다. Bourne에서 찾은 연산자 csh가 없으므로 stderr를 리디렉션 2>&1하는 유일한 방법 csh입니다.
zsh(종종) csh구문 도 제공 하지만 Bourne 쉘 의 x>&y fd 복제 연산자 도 지원하므로 충돌이 발생합니다.
ls >&file
ls의 stdout 및 stderr을로 리디렉션 file하지만 파일이 2인 경우 다음 과 같은 문제가 있습니다.
ls >&2
fd 2 ( dup(2, 1))가 가리키는 자원으로 stdout을 리디렉션하는 것을 의미 합니다. 그래서 당신은 그것을 작성해야합니다 :
ls >& ./2
stdout 및 stderr을 모두 현재 디렉토리에서 ls호출 2된 파일로 경로 재 지정하려는 경우 또는 표준 구문을 사용하십시오.
bash처음에는 이해하지 못했지만 대신 연산자를 >&도입 &>하여 프로세스에서 POSIX 준수를 위반했습니다 (스크립트가 사용하지는 않지만 cmd &> xxx).
ksh2009 년 ksh93t +에서 해당 연산자를 복사 posix했지만 2008 년 R35에서 mksh ( 모드 에서 비활성화 됨)는 복사 하지 않았습니다 >&.
bash>&2.05에서 추가 지원 .
busybox 는 1.13 (2008) 및 sh둘 다에 대한 지원을 추가했습니다 .&>>&
어느 쪽 >&도 &>리디렉션 표준 출력과 표준 에러를 의미하는 것으로 POSIX / Bourne의 없습니다.
stdout과 stderr을 모두 이식 가능하게 리디렉션하려면 구문은 다음과 같습니다.
cmd > file 2>&1