Diferenças de redirecionamento entre & & e 2 & 1

11

Em este segmento SO e Alguns outros tópicos vi os seguintes comandos para redirecionar stdout e stderr para um arquivo.

Eles são todos equivalentes? Existe alguma diferença entre eles?

command1 >> logfile 2>&1
command &> logfile
command >& logfile
    
por Amelio Vazquez-Reina 28.12.2014 / 04:40

2 respostas

7

Como você marcou zsh , deixe-me dizer que todos os três redirecionamentos funcionam exatamente da mesma maneira. Como você deve ter lido em ambas as postagens duplicadas (a do comentário e a da sua postagem), todas redirecionam stderr para stdout , o que é redirecionado para o arquivo 'logfile' (ou seja, o arquivo de log será conter a saída e os erros).

Mas o comportamento deles muda muito dependendo do shell em que você está.

Todos os três estilos de redirecionamento funcionam bem da mesma maneira em bash e zsh

Mas:

Apenas >& funciona em csh ou tcsh

[soum@server ~]$  ./test.sh > logfile 2>&1
Ambiguous output redirect.
[soum@server ~]$ ./test.sh &> logfile
Invalid null command.
[soum@server ~]$ ./test.sh >& logfile
[soum@server ~]$ echo $SHELL
/bin/tcsh
[soum@server ~]$

Em ksh apenas 2>&1 funciona.

$ ./test.sh >& logfile
-ksh: logfile: bad file unit number
$ ./test.sh &> logfile
[1]     23039
$ 1  2  3  4  5  6  logfile  test.sh
ls: cannot access ttr: No such file or directory

[1] +  Done(2)                 ./test.sh &> logfile

Eu odeio ksh . Enquanto >& apenas deu um erro, o &> pagou uma parte do comando e esvaziou o arquivo de log (se não estiver vazio).

    
por 28.12.2014 / 06:16
1

&> e >& semi-equivalência (clobber)

A seção zsh manual Redirections diz que:

  • &>
  • >&

são equivalentes.

Ambos irão destruir o arquivo - truncá-lo para 0 bytes antes de gravar nele, assim como > file faria no caso somente STDIN.

No entanto , a bash seção Redirecionamentos manuais adiciona que:

Of the two forms, the first is preferred. This is semantically equivalent to

>word 2>&1

When using the second form, word may not expand to a number or -. If it does, other redirection operators apply (see Duplicating File Descriptors below) for compatibility reasons.

Então, enquanto você marcou zsh , provavelmente é uma boa prática obter a memória do dedo no primeiro formulário, caso alguém já tenha escrito um script bash .

>> logfile 2>&1 e &>> equivalência (anexo)

Aqui, logfile não é sobrescrito, mas aberto para gravação no final do arquivo, ou seja, no modo de acréscimo ( O_APPEND ).

O equivalente em ambos os {ba,z}sh é:

command1 &>> logfile

Em bash :

The format for appending standard output and standard error is:

&>>word

This is semantically equivalent to

>>word 2>&1

(see Duplicating File Descriptors below).

(Nota: o uso de &> sobre >& na seção acima é novamente recomendado, pois há apenas uma maneira de anexar em bash .)

zsh permite os formulários &>> e >>& .

    
por 30.06.2018 / 08:15