Editei uma resposta no Ask Ubuntu que sugeria o seguinte
nohup gedit >& /dev/null &
Quando eles realmente quiseram dizer
nohup gedit &> /dev/null &
O último redireciona corretamente o stderr e o stdout para /dev/null
. Eu esperava que o primeiro crie um arquivo chamado &
ou, mais provavelmente, dê um erro, como ocorre em outros casos:
$ echo "foo" >&
bash: syntax error near unexpected token `newline'
Em vez disso, parece funcionar exatamente da mesma maneira que a anterior, uma gedit
janela aparece e nenhuma mensagem de erro é impressa.
Também devo observar que isso é específico do shell:
bash
(4.2.45 (1) -release),zsh
(5.0.2),csh
(versão do pacote deb: 20110502-2) etcsh
(6.18.01): funciona como descrito acima, sem mensagem de erro, sem arquivos criados.dash
(0.5.7-3):$ nohup gedit >& /dev/null & $ dash: 2: Syntax error: Bad fd number
ksh
(93u + 2012-08-01): falha, mas aparentemente um processo foi iniciado (1223
) embora nenhumagedit
janela apareça:$ 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 & ^
Então, por que esse comando simplesmente é executado sem erros (e nenhum arquivo de saída criado) em alguns shells e falha em outros? O que está >&
fazendo no caso aparentemente especial de nohup
? Suponho que isso >& /dev/null
esteja sendo interpretado como >&/dev/null
mas por que o espaço não está causando um erro nessas conchas?
fonte
dash
.nohup command
, Execute tty independente seu application.According à minha memória,dash
estendida deash
,Debian ash
,ash
desenvolvido pelaOpenBSD
e é shell limitado, mesmo OS Maemo (Debian Base n900 mobile) utiliza traço,ash
shell família têm uso limitado esperar de bash ou tcsh.dash
imprimir minha versão, mas o pacote é0.5.7-3
: qual é a sua? Além disso, você tem certeza de que está executandodash
? Esse é o padrão do Ubuntu,sh
não é?nohup
faz, minha pergunta é por que o>&
parece funcionar com nohup sozinho em algumas conchas.Respostas:
é a sintaxe POSIX e é o mesmo que:
Isso é executado
nohup gedit
em segundo plano e, em seguida, faz um> /dev/null
redirecionamento sem executar um comando.não é sintaxe POSIX e é a
csh
maneira de redirecionar stdout e stderr para / dev / null.csh
não possui o2>&1
operador encontrado em Bourne, portanto, é a única maneiracsh
de redirecionar o stderr.zsh
(com frequência) também fornece acsh
sintaxe, mas também suporta o operador dex>&y
duplicação fd do shell Bourne, o que significa que há um conflito lá.redireciona
ls
o stdout e o stderr parafile
, mas se o arquivo for2
, você terá um problema comosignifica redirecionar stdout para o recurso apontado por fd 2 (
dup(2, 1)
). Então você precisa escrever:se você deseja redirecionar o stdout e o stderr
ls
para um arquivo chamado2
no diretório atual; ou use a sintaxe padrão.bash
inicialmente não entendi>&
, mas introduziu o&>
operador para isso, quebrando a conformidade com POSIX no processo (embora seja improvável que um script usassecmd &> xxx
).ksh
copiou esse operador no ksh93t + em 2009, mksh no R35 em 2008 (desativado noposix
modo), mas não>&
.bash
suporte adicionado para>&
2.05.O busybox
sh
adicionou suporte para ambos&>
e>&
em 1.13 (2008).Nem como
>&
nem&>
o redirecionamento de significado stdout e stderr são POSIX / Bourne.Se você deseja redirecionar stdout e stderr de forma portável, a sintaxe é
fonte
POSIX/Bourne
por "Bourne"?