qual é a diferença entre '/ dev / stderr' (com o espaço em branco) e '& 2'?

10

No bash.

Estou com alguma dificuldade para determinar o que devo usar?

todos os meus scripts usam "> > / dev / stderr"

no prompt do bash, se eu tentar:
echo test >>/dev/stderr funciona em echo test >> /dev/stderr funciona em echo test >/dev/stderr funciona em echo test > /dev/stderr funciona

echo test >>&2 FALHA!
echo test >> &2 FALHA!
echo test >&2 funciona
echo test > &2 FALHA!

Estou disposto a alterar todos os meus scripts para >&2 .

Parece que também tem um grande efeito sobre o ssh (após su SomeUser ), onde >>/dev/stderr não funcionará (permissão negada), somente >&2 funcionará.

    
por Aquarius Power 20.12.2016 / 19:55

3 respostas

21

>& n é a sintaxe da shell para duplicar diretamente um descritor de arquivo . O descritor de arquivo 2 é stderr; é assim que funciona. Você pode duplicar outros descritores de arquivos, não apenas stderr. Você não pode usar o modo append aqui porque a duplicação de um descritor de arquivo nunca trunca (mesmo que o stderr seja um arquivo) e >& é um token, é por isso que você não pode colocar um espaço dentro dele, mas >& 2 funciona.

>> name é uma sintaxe permitida diferente, em que name é um nome de arquivo (e o token é >> ). Neste caso, você está usando o nome do arquivo /dev/stderr , que por manipulação específica do SO (no Linux, é um link simbólico para /proc/self/fd/2 ) também significa erro padrão. Anexar e truncar o modo ambos acabam fazendo a mesma coisa quando o stderr é um terminal porque não pode ser truncado. Se o erro padrão for um arquivo, o será truncado:

anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye

Se você estiver vendo um erro com /dev/stderr sobre ssh, é possível que o administrador do servidor tenha aplicado alguma medida de segurança para impedir que o symlink funcione. (Por exemplo, você não pode acessar /proc ou /dev ). Embora eu espere causar qualquer tipo de quebra estranha, usar a sintaxe do descritor de arquivo duplicado é uma abordagem perfeitamente razoável (e provavelmente um pouco mais eficiente). Pessoalmente eu prefiro isso.

    
por 20.12.2016 / 20:31
8

Os casos de falha ocorrem porque a sintaxe bash para O uso de & em redirecionamentos especifica um único > e exige que ele exista diretamente ao lado do sinal & :

[n]>&word

    
por 20.12.2016 / 20:30
2

Use '>' para redirecionar (truncar se houver) ou '>>' (acrescentar se existir).

Use '>&' para duplicar um fluxo, por exemplo, se você quiser saída padrão E erro padrão no mesmo arquivo, você redireciona para o arquivo '> output.log' e também erro com '2>&'

myjob.sh > output.log 2>&
    
por 22.12.2016 / 10:45