Eu começo no diretório vazio.
$ touch aFile
$ ls
aFile
Então eu ls
dois argumentos, um dos quais não está neste diretório. Redireciono os dois fluxos de saída para um arquivo chamado output
. Eu uso >>
para evitar escrever simultaneamente.
$ ls aFile not_exist >>output 2>>output
$ cat output
ls: cannot access 'not_exist': No such file or directory
aFile
O que parece funcionar. Há algum perigo para esta abordagem?
O que acontece quando você faz
é que
file
será aberto para anexar duas vezes. Isso é seguro em um sistema de arquivos POSIX. Qualquer gravação que ocorra no arquivo quando ele for aberto para anexação ocorrerá no final do arquivo, independentemente de os dados virem do fluxo de saída padrão ou do fluxo de erro padrão.Isso depende do suporte para operações de gravação de acréscimo atômico no sistema de arquivos subjacente. Alguns sistemas de arquivos, como o NFS, não suportam anexos atômicos. Veja, por exemplo, a pergunta "O anexo de arquivo é atômico no UNIX?" no StackOverflow.
Usando
funcionaria mesmo em NFS embora.
No entanto, usando
não é seguro, pois o shell truncará o arquivo de saída (duas vezes) e qualquer gravação que ocorra em qualquer fluxo substituirá os dados já gravados pelo outro fluxo.
Exemplo:
A
hello
string é gravada primeiro (com uma nova linha final) e, em seguida, a stringabc
seguida por uma nova linha é gravada a partir do erro padrão, substituindo o arquivohell
. O resultado é a stringabc
com uma nova linha, seguida pelo que resta da primeiraecho
saída, umao
e uma nova linha.Trocar os dois
echo
ao redor produz apenashello
no arquivo de saída, pois essa string é escrita por último e é mais longa que aabc
string. A ordem em que os redirecionamentos ocorrem não importa.Seria melhor e mais seguro usar a linguagem mais idiomática
Não, não é tão seguro quanto o padrão
>>bar 2>&1
.Quando você está escrevendo
você está abrindo o
bar
arquivo duas vezes comO_APPEND
, criando dois objetos de arquivo completamente independentes[1], cada um com seu próprio estado (ponteiro, modos abertos, etc).Isso é muito diferente
2>&1
do que é apenas chamar a chamada dodup(2)
sistema e torna os aliases intercambiáveis stderr e stdout para o mesmo objeto de arquivo.Agora, há um problema com isso:
bar
Geralmente, você pode contar com a probabilidade do arquivofoo >>bar 2>&1
ser gravado ao mesmo tempo em dois locais separados, sendo bastante baixa. Mas pelo seu>>bar 2>>bar
você acabou de aumentar em uma dúzia de ordens de grandeza, sem qualquer razão.[1] "Abrir descrições de arquivos" na linguagem POSIX.
Depende do que você quer alcançar. Cabe a você decidir se está tudo bem ter erros no mesmo arquivo que a saída. Isso é apenas salvar texto em um arquivo com a funcionalidade do shell que permite redirecionar como desejar. Não existe um sim ou não absoluto. Como tudo no Linux pode ser feito de várias maneiras, esta é a minha maneira
ls notExistingFile existingFile >> output 2>&1
de responder à pergunta: Em termos de redirecionamento em si, sim é perfeitamente seguro.