왜 'nohup command> & / dev / null'이 일부 쉘에서“작동”하는 것처럼 보입니까?


12

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하지만 왜이 쉘에서 공간이 오류를 일으키지 않습니까?


내 컴퓨터 인 Ubuntu 12.04에서이 명령은에 대해 정상적으로 실행됩니다 dash.
cuonglm

nohup command, 내 기억에 실행하는 독립적 인 청각 장애 당신의 application.According dash의 확장 ash, Debian ash, ash에 의해 개발 OpenBSD과 이용이 제한 쉘, 심지어 마에 모 OS 대시를 사용합니다 (N900 모바일에 데비안 자료)이다, ash가족 쉘은 제한적인 사용이 떠들썩한 파티 또는 tcsh를 기대합니다.
페르시아 걸프

@Gnouc huh, 아마도 다른 버전 (나는 Debian에 있습니다)? dash버전을 인쇄 하는 방법을 알 수 없지만 패키지는 0.5.7-3무엇입니까? 또한 실행 중 dash입니까? 그것은 우분투의 기본값 sh이 아닙니까?
terdon

@MohsenPahlevanzadeh 나는 당신의 요점이 무엇인지 잘 모르겠습니다. 무엇을하는지 알고 있습니다 nohup. 제 질문은 왜 >&일부 껍질에서 nohup과 함께 작동 하는 것 같습니다.
terdon

다음 링크를 사용하여 포탄의 별 모양을 볼 수 있습니다 : unix.stackexchange.com/questions/45684/…
PersianGulf

답변:


18
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

POSIX/Bourne"Bourne"이 Bash를 의미 합니까?
Pandya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.