Na festança.
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
echo test >> /dev/stderr
funciona
echo test >/dev/stderr
funciona
echo test > /dev/stderr
funciona
echo test >>&2
FALHAS!
echo test >> &2
FALHAS!
echo test >&2
funciona
echo test > &2
FALHA!
Estou disposto a mudar todos os meus scripts para >&2
.
Parece também ter um grande efeito sobre o ssh (depois su SomeUser
), onde >>/dev/stderr
não funcionará (permissão negada), apenas >&2
funcionará.
bash
ssh
io-redirection
stderr
Poder de Aquário
fonte
fonte
su
que o problema acontece, atualizou a questão #su -c 'some command'
, esse comando é executado por/bin/sh
, e nãobash
por um comportamento específico do bash (como simular/dev/stderr
para fins de redirecionamento quando não disponível) não estiver presente.Respostas:
>& n
é uma sintaxe do shell para duplicar diretamente um descritor de arquivo . O descritor de arquivo 2 é stderr; é assim que isso funciona. Você também pode duplicar outros descritores de arquivos, não apenas stderr. Você não pode usar o modo de anexação aqui porque a duplicação de um descritor de arquivo nunca trunca (mesmo que o stderr seja um arquivo) e>&
seja um token, é por isso que você não pode colocar um espaço nele - mas>& 2
funciona.>> name
é uma sintaxe permitida diferente, ondename
é um nome de arquivo (e o token é>>
). Nesse caso, você está usando o nome do arquivo/dev/stderr
, que por manipulação específica do SO (no Linux, é um link simbólico/proc/self/fd/2
) também significa erro padrão. Os modos de acréscimo e truncamento acabam fazendo a mesma coisa quando stderr é um terminal, porque isso não pode ser truncado. Se o seu erro padrão for um arquivo, ele será truncado:Se você estiver vendo um erro com
/dev/stderr
over ssh, é possível que o administrador do servidor tenha aplicado alguma medida de segurança para impedir que o link simbólico funcione. (Por exemplo, você não pode acessar/proc
ou/dev
). Embora eu espere causar todos os tipos de falhas estranhas, o uso da sintaxe do descritor de arquivo duplicado é uma abordagem perfeitamente razoável (e provavelmente um pouco mais eficiente). Pessoalmente, eu prefiro.fonte
>>
, thx por apontar isso! Além disso, perdi um passosu SomeUser
depois de conectar através do ssh.bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/foo
não truncará tho! (mesmo com2>&1 |tee /tmp/foo
) o que é perfeito para o log e funcionará perfeitamente depois que eu mudar tudo para>&2
. Então, acho que apenas um uso direto de arquivo/dev/stderr
permite truncar, não o descritor duplicado, cool thx!Os casos de falha ocorrem porque a sintaxe do bash para uso
&
em redirecionamentos especifica uma única>
e requer que ela exista diretamente adjacente ao&
sinal:fonte
Use
'>'
para redirecionar (trunca se houver) ou'>>'
(anexa se existir).Use
'>&'
para duplicar um fluxo, por exemplo, se você deseja saída padrão E erro padrão no mesmo arquivo, você redireciona para o arquivo'> output.log'
e também erro com'2>&'
fonte