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 패키지 버전 :tcsh
20110502-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 구문이 아니며 csh
stdout 및 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
).
ksh
2009 년 ksh93t +에서 해당 연산자를 복사 posix
했지만 2008 년 R35에서 mksh ( 모드 에서 비활성화 됨)는 복사 하지 않았습니다 >&
.
bash
>&
2.05에서 추가 지원 .
busybox 는 1.13 (2008) 및 sh
둘 다에 대한 지원을 추가했습니다 .&>
>&
어느 쪽 >&
도 &>
리디렉션 표준 출력과 표준 에러를 의미하는 것으로 POSIX / Bourne의 없습니다.
stdout과 stderr을 모두 이식 가능하게 리디렉션하려면 구문은 다음과 같습니다.
cmd > file 2>&1