Apenas procurando a diferença entre
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
e sua portabilidade com non-Bourne shells
como tcsh
, mksh
, etc.
Apenas procurando a diferença entre
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
e sua portabilidade com non-Bourne shells
como tcsh
, mksh
, etc.
&>
a compatibilidade do GNU bash, é altamente recomendável não usá-lo, pois a análise pode quebrar a semântica dos scripts POSIX existentes, e o mksh já o desativa no modo POSIX.^ /dev/null
o que isso faz?Respostas:
Para o fundo:
Primeiro, vamos abordar a função deles. Para referência, consulte o Advanced Bash-Scripting Guide .
Funções
2>&-
A forma geral deste é
M>&-
onde "M" é um número de descritor de arquivo. Isso fechará a saída para qualquer descritor de arquivo mencionado, ou seja, "M" .2>/dev/null
A forma geral deste é
M>/dev/null
onde "M" é um número de descritor de arquivo. Isso redirecionará o descritor de arquivo "M" para/dev/null
.2>&1
A forma geral deste é
M>&N
onde "M" e "N" são números de descritores de arquivos. Ele combina a saída dos descritores de arquivo "M" e "N" em um único fluxo.|&
Esta é apenas uma abreviação para
2>&1 |
. Foi adicionado no Bash 4.&>/dev/null
Esta é apenas uma abreviação para
>/dev/null 2>&1
. Ele redireciona o descritor de arquivo 2 (STDERR) e o descritor 1 (STDOUT) para/dev/null
.>/dev/null
Esta é apenas uma abreviação para
1>/dev/null
. Ele redireciona o descritor de arquivo 1 (STDOUT) para/dev/null
.Portabilidade para não bash, tcsh, mksh, etc.
Eu não lidei muito com outras conchas fora de
csh
etcsh
. Minha experiência com esses 2 em comparação com os operadores de redirecionamento do bash é que o bash é superior nesse aspecto. Veja a página de manual do tcsh para mais detalhes.Dos comandos que você perguntou sobre nenhum são suportados diretamente pelo csh / tcsh. Você precisaria usar diferentes sintaxes para construir funções semelhantes.
fonte
2>&-
vs2>/dev/null
(exceto que alguns programas escritos "mal" não compreendem2>&-
corretamente)?&>
estava presentebash
desde o início (e quebra a compatibilidade com Bourne e POSIX, pois significa algo diferente lá, embora seja improvável que seja atingido).>&
e|&
vem(t)csh
(e é a única maneira de redirecionar o stderr). Eles estavamzsh
desde o início e foram adicionados apenas recentemente abash
. Veja tambémrc
para operadores melhor projetados.(+2-2=0)
. Agora, para a parte da edição, não edito muito, mas nesse caso, o faria, porque esclarece que os dados após a operação estariam emN
. Eu li sua resposta e é muito bom em todos os aspectos. Apenas essa pequena ambiguidade me fez pensar, é por isso que a edição. Mas ok, sinta-se à vontade para adicioná-lo novamente ou rejeitá-lo, como quiser. Espero poder explicar o ponto. Mantenha o bom trabalho.Isso é para redirecionar o STDERR & STDOUT:
2>/dev/null
Redirecione STDERR para / dev / null (impedir que apareça no console)
|&
Redirecione STDERR e STDOUT para STDIN do comando canalizado (cmd1 | & cmd2)
&>/dev/null
Redirecione STDERR e STDOUT para / dev / null (nada aparece no console)
>/dev/null
Redirecione STDOUT para / dev / null (apenas STDERR é exibido no console)
2>&-
É para fechar um descritor de arquivo usado com redirecionamento
Todos esses são métodos de redirecionamento padrão para os shells Bourne.
fonte
|&
e não&>/dev/null
são portáteis.Considere isso um adendo à resposta selecionada. Você pode querer saber quais formulários são POSIX e quais não são.
Dois formulários POSIX estão envolvidos:
-
Portanto:
A última linha não está na pergunta original, mas funciona sem reclamação no bash. (Também funciona com / dev / tty substituído por / dev / null).
fonte