Se usarmos echo 1234 >> some-file
, a Documentação diz que a saída é anexada.
Meu palpite é que, se algum arquivo não existir, o O_CREAT criará um novo arquivo. Se >
foi usado, o O_TRUNC truncará o arquivo existente.
No caso de >>
: O arquivo será aberto como O_WRONLY (ou O_RDWR) e será solicitado que a operação de finalização e gravação seja concluída, simulando O_APPEND? Ou o arquivo será aberto como O_APPEND, deixando-o no kernel para garantir que os anexos ocorram?
Estou perguntando isso, porque um processo de servidor de servidor substitui alguns marcadores inseridos por eco, quando o arquivo de saída é do ponto de montagem do NFS, e a Documentação do NFS diz que O_APPEND não é suportado no servidor, portanto o kernel do cliente terá que lidar com isso. Eu acho que o processo do conservador está usando O_APPEND, mas não tenho certeza do bash >>
no linux, fazendo a pergunta aqui.
O_APPEND
é que não é suportado; o problema é que ele é emulado. Em um sistema de arquivos local, vários processos de gravação no mesmo arquivo abertoO_APPEND
nunca substituem os dados um do outro; no NFS,O_APPEND
é emulado buscando o final antes de escrever, o que deixa a possibilidade de condições de corrida. Não há como contornar isso no NFS; cada gravador paralelo precisa gravar seu próprio arquivo. A única maneira de contornar isso é configurar um processo do servidor no servidor NFS, fazer com que os registradores façam logon|nc server port
e que o servidor anexe os dados recebidos ao log.Respostas:
Eu executei o seguinte:
strace -o spork.out bash -c "echo 1234 >> some-file"
para descobrir sua pergunta. Isto é o que eu encontrei:Nenhum arquivo chamado "some-file" existia no diretório em que eu executei o
echo
comando.fonte
Isso não é feito apenas no Bash, é exigido pelo padrão.
Na especificação Single Unix :
Qualquer shell compatível com POSIX, portanto, deve fazê-lo. Em alguns sistemas Unix,
/bin/sh
pode ser um shell Bourne não POSIX (o shell Bourne foi originalmente escrito antes de terO_APPEND
sido inventado) e o shell POSIX disponível normalmente seráksh
, o que estará disponívelsh
em um local de caminho diferente, como o Solaris/usr/xpg4/bin
.fonte
open()
.>>
foi introduzido por seu antecessor, o shell Thomson.Procurando na fonte, ele usa O_APPEND. Para o bash 4.3.30 na
make_cmd.c
linha 710-713, leia:fonte
Vamos investigar isso usando
strace
em um sistema de arquivos local (não NFS):Outros conchas, ou seja
dash
,dash
,sh
de busybox' emksh
se comportam da mesma maneira.A opção
-e open
significa-e trace=open
rastrear apenas aopen()
chamada do sistema.fonte