왜 ‘nohup command> & / dev / null’이 일부 쉘에서“작동”하는 것처럼 보입니까? 버전 : tcsh20110502-2)

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


답변