Почему «команда nohup> & / 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: 20110502-2) и tcsh(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и она ограничена оболочки, даже Maemo OS (Debian Base на n900 мобильный) использует тир, ashсемейство оболочка имеет ограниченное использование ожидать от Баш или Tcsh.
PersianGulf
@ Gnouc, а, может, другая версия (я на Debian)? Я не могу понять, как заставить мой dashраспечатать его версию, но пакет 0.5.7-3, какой у тебя? Кроме того, ты уверен, что бежишь dash? Это Ubuntu по умолчанию sh, не так ли?
Тердон
@MohsenPahlevanzadeh Я не уверен, в чем твоя точка зрения, я знаю, что nohupделает, мой вопрос, почему >&кажется, что работает в некоторых оболочках только с nohup.
Тердон
Вы можете использовать следующую ссылку для просмотра оболочек: 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 и является cshспособом перенаправления как stdout, так и stderr в / dev / null. cshне имеет 2>&1оператора, как в Bourne, поэтому это единственный способ cshперенаправить stderr.

zsh(как часто) также предоставляет cshсинтаксис, но также поддерживает оператор x>&y дублирования fd оболочки Bourne, что означает, что там есть конфликт.

ls >&file

перенаправляет lsstdout и stderr на file, но если файл есть 2, у вас проблема как

ls >&2

означает перенаправление stdout на ресурс, на который указывает fd 2 ( dup(2, 1)). Так что вам нужно написать это:

ls >& ./2

если вы хотите перенаправить как stdout, так и stderr of lsв файл, вызываемый 2в текущем каталоге; или используйте стандартный синтаксис.

bashПервоначально не понимал >&, но &>вместо этого он ввел оператор, нарушая соответствие POSIX в процессе (хотя вряд ли сценарий будет использовать cmd &> xxx).

kshСкопировал этот оператор в ksh93t + в 2009 году, mksh в R35 в 2008 году (отключен в posixрежиме), но нет >&.

bashдобавлена ​​поддержка >&в 2.05.

busybox shдобавил поддержку для обоих &>и >&в 1.13 (2008).

Ни , >&ни &>в том смысле , перенаправлять стандартный вывод и стандартный поток ошибок не POSIX / Bourne.

Если вы хотите перенаправить как stdout, так и stderr, синтаксис

cmd > file 2>&1
Стефан Шазелас
источник
Вы имеете в виду Bash в POSIX/Bourne"Bourne"?
Pandya