Diferença entre 2 e -, 2 / dev / null, | &, / dev / null e / dev / null 2 & 1

165

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.

    
por Det 03.04.2013 / 03:25

3 respostas

213

Para o fundo:

  • um número 1 = padrão (ou seja, STDOUT)
  • um número 2 = erro padrão (por exemplo, STDERR)
  • se um número não for fornecido explicitamente, então número 1 será assumido pelo shell (bash)

Primeiro, vamos abordar a função destes. Para referência, consulte o Guia Avançado de Roteiro de Bash .

Funções

2>&-

A forma geral desta é M>&- , onde "M" é um número de descritor de arquivo. Isso fechará a saída para qualquer descritor de arquivo mencionado, por exemplo, "M" .

2>/dev/null

A forma geral desta é 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 desta é M>&N , onde "M" & "N" são números descritores de arquivos. Ele combina a saída dos descritores de arquivos "M" e "N" em um único fluxo.

|&

Esta é apenas uma abreviação de 2>&1 | . Foi adicionado no Bash 4.

&>/dev/null

Esta é apenas uma abreviação de >/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 de 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 outros shells fora de csh e tcsh . Minha experiência com esses 2 em comparação com os operadores de redirecionamento do bash é que o bash é superior a esse respeito. Veja a página do manual do tcsh para mais detalhes.

Os comandos que você perguntou sobre nenhum são diretamente suportados pelo csh / tcsh. Você teria que usar sintaxes diferentes para construir funções semelhantes.

    
por 03.04.2013 / 05:44
10

Isto é para redirecionar o STDERR & STDOUT:

  • 2>/dev/null

    Redirecione STDERR para / dev / null (evite aparecer no console)

  • |&

    Redirecionar STDERR e STDOUT para STDIN do comando canalizado (cmd1 | & cmd2)

  • &>/dev/null

    Redirecionar ambos STDERR & STDOUT para / dev / null (nada aparece no console)

  • >/dev/null

    Redirecionar STDOUT para / dev / null (somente STDERR mostra no console)

  • 2>&-

    É para fechar um descritor de arquivo usado com redirecionamento

Estes são todos os métodos de redirecionamento padrão para os shells Bourne.

    
por 03.04.2013 / 04:25
1

Considere isso como 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:

2.7.2 Redirecting Output

The two general formats for redirecting output are:

[n]>word

[n]>|word

where the optional n represents the file descriptor number. If the number is omitted, the redirection shall refer to standard output (file descriptor 1).

Output redirection using the '>' format shall fail if the noclobber option is set (see the description of set -C) and the file named by the expansion of word exists and is a regular file. Otherwise, redirection using the '>' or ">|" formats shall cause the file whose name results from the expansion of word to be created and opened for output on the designated file descriptor, or standard output if none is specified. If the file does not exist, it shall be created; otherwise, it shall be truncated to be an empty file after being opened.

-

2.7.6 Duplicating an Output File Descriptor

The redirection operator:

[n]>&word

shall duplicate one output file descriptor from another, or shall close one. If word evaluates to one or more digits, the file descriptor denoted by n, or standard output if n is not specified, shall be made to be a copy of the file descriptor denoted by word; if the digits in word do not represent a file descriptor already open for output, a redirection error shall result; see Consequences of Shell Errors. If word evaluates to '-', file descriptor n, or standard output if n is not specified, is closed. Attempts to close a file descriptor that is not open shall not constitute an error. If word evaluates to something else, the behavior is unspecified.

Portanto:

Function      POSIX-compat    POSIX 
2>&-          Yes             close 
2>/dev/null   Yes             redir
2>&1          Yes             dup 
|&            No              
&>/dev/null   No
>/dev/null    Yes             redir
>&/dev/null   ?               ?dup

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).

    
por 30.03.2018 / 05:10