Eu começo no diretório vazio.
$ touch aFile
$ ls
aFile
Então, eu tenho ls
dois argumentos, um dos quais não está neste diretório. Eu 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. Existem perigos para essa abordagem?
io-redirection
stdout
stderr
exit_status
fonte
fonte
ls aFile not_exist &>>output
aqui? (Observe, eu estou supondo que você esteja usando o bash .)&>>
NÃO é padrão. É uma sintaxe depreciada e ambígua que funciona de maneira diferente em diferentes tipos de conchas. Eu me pergunto de onde vocês tiram suas coisas.ls &>>foo ...
sejam analisados como dois comandosls &
e>>foo ...
, e é dessa maneira que outros shells como o/bin/sh
do Ubuntu o estão analisando. Por ter sido preterido, você pode olhar aqui - embora eu não finja que é algum tipo de autoridade. Você pode perguntar aosbash
mantenedores se eles consideram usar essa uma boa idéia.Respostas:
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 vezesO_APPEND
, criando dois objetos de arquivo completamente independentes [1], cada um com seu próprio estado (ponteiro, modos abertos, etc.).Isso é muito diferente do
2>&1
que está apenas chamando adup(2)
chamada de sistema e cria os aliases intercambiáveis stderr e stdout para o mesmo objeto de arquivo.Agora, há um problema com isso:
Você geralmente pode contar com a probabilidade do arquivo como
bar
emfoo >>bar 2>&1
sendo gravados ao mesmo tempo em dois lugares separados sendo bastante baixa. Mas, pelo seu,>>bar 2>>bar
você apenas o aumentou em uma dúzia de ordens de magnitude, sem qualquer motivo.[1] "Abrir descrições de arquivo" na linguagem POSIX.
fonte
O_APPEND
é uma espécie de falha de qualquer maneira - bastante oneroso para implementar corretamente.O_APPEND
, o cliente recuperará primeiro o tamanho "real" do arquivo do servidor ("revalidará" o inode) e, em seguida, fará a atualização de inode em cache + write + em cache, e somente a última parte será feito sob bloqueios, o que significa que a primeira parte ainda pode recuperar um tamanho obsoleto do servidor e substituir o correto do inode local / em cache. Mesmo problema comlseek(SEEK_END)
.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 aconteça no arquivo quando ele for aberto para anexar ocorrerá no final do arquivo, independentemente de os dados chegarem ao fluxo de saída padrão ou ao 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 arquivo é anexado atômico no UNIX?" No StackOverflow.
Usando
funcionaria mesmo no NFS.
No entanto, usando
não é seguro, pois o shell truncará o arquivo de saída (duas vezes) e qualquer gravação que ocorrer em um fluxo substituirá os dados já gravados pelo outro fluxo.
Exemplo:
A
hello
sequência é gravada primeiro (com uma nova linha final) e, em seguida, a sequênciaabc
seguida por uma nova linha é gravada a partir do erro padrão, substituindo ahell
. 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 do ferimento produz apenashello
no arquivo de saída, pois a sequência é escrita por último e é maior que aabc
sequência. A ordem na qual os redirecionamentos ocorrem não importa.Seria melhor e mais seguro usar o método mais idiomático
fonte
>>
aconteça com as conchas modernas, esse não era o caso no shell Bourne ou Thomson (de onde vem), onde>>
se abriria para escrever e procuraria até o fim (suponho que O_APPEND ainda não foi inventado naquela época). Mesmo no Solaris 10,/bin/sh -c '(echo a; echo b >&2) >> file 2>> file; cat file'
saídasb
.sh
ou o sistema de arquivos do Solaris 10 ?>>
originalmente estava fazendo, não estava abrindo com O_APPEND, estava abrindo sem e procurando até o fim. Não é tanto um problema, é o que ele estava fazendo e foi documentado para fazer.Depende do que você deseja alcançar. Cabe a você decidir se há erros no mesmo arquivo que a saída. Isso é apenas salvar o texto em um arquivo com a funcionalidade do shell, que permite redirecionar conforme desejado. Não existe um sim ou não absoluto. Como tudo no Linux, isso pode ser feito de várias maneiras, este é o meu caminho
ls notExistingFile existingFile >> output 2>&1
Para responder à pergunta: Em termos de redirecionamento, sim, é perfeitamente seguro.fonte
>
vez de>>
substituirá alguns caracteres. Portanto, não é apenas o shell que me permite redirecionar, porque quando eu redireciono com>
, o resultado é diferente. Então, existem nuances com>
, existem com>>
?>
- substituir.>>
- append