Я отредактировал ответ на 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
но почему пространство не вызывает ошибку в этих оболочках?
источник
dash
.nohup command
Запустите независимый терминал вашего application.According в мою память,dash
расширенной изash
,Debian ash
,ash
разработанныхOpenBSD
и она ограничена оболочки, даже Maemo OS (Debian Base на n900 мобильный) использует тир,ash
семейство оболочка имеет ограниченное использование ожидать от Баш или Tcsh.dash
распечатать его версию, но пакет0.5.7-3
, какой у тебя? Кроме того, ты уверен, что бежишьdash
? Это Ubuntu по умолчаниюsh
, не так ли?nohup
делает, мой вопрос, почему>&
кажется, что работает в некоторых оболочках только с nohup.Ответы:
это синтаксис POSIX и такой же как:
Это выполняется
nohup gedit
в фоновом режиме, а затем выполнить> /dev/null
перенаправление без выполнения команды.не является синтаксисом POSIX и является
csh
способом перенаправления как stdout, так и stderr в / dev / null.csh
не имеет2>&1
оператора, как в Bourne, поэтому это единственный способcsh
перенаправить stderr.zsh
(как часто) также предоставляетcsh
синтаксис, но также поддерживает операторx>&y
дублирования fd оболочки Bourne, что означает, что там есть конфликт.перенаправляет
ls
stdout и stderr наfile
, но если файл есть2
, у вас проблема какозначает перенаправление stdout на ресурс, на который указывает fd 2 (
dup(2, 1)
). Так что вам нужно написать это:если вы хотите перенаправить как 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, синтаксис
источник
POSIX/Bourne
"Bourne"?