Si usamos, echo 1234 >> some-file
entonces la documentación dice que la salida se agrega.
Supongo que si algún archivo no existe, O_CREAT creará un nuevo archivo. Si >
se utilizó, entonces O_TRUNC truncará el archivo existente.
En caso de >>
: ¿Se abrirá el archivo como O_WRONLY (u O_RDWR) y se buscará que finalice y se complete la operación de escritura, simulando O_APPEND? ¿O se abrirá el archivo como O_APPEND, dejándolo en el kernel para asegurarse de que se agregue?
Pregunto esto porque un proceso de conservación está sobrescribiendo algunos marcadores insertados por echo, cuando el archivo de salida es del punto de montaje NFS, y la documentación de NFS dice que O_APPEND no es compatible con el servidor, por lo que el núcleo del cliente tendrá que manejarlo. Supongo que el proceso de conservación está usando O_APPEND, pero no estoy seguro de bash >>
en Linux, por lo tanto, haga la pregunta aquí.
O_APPEND
es que no sea compatible; El problema es que es emulado. En un sistema de archivos local, varios procesos que escriben en el mismo archivo abiertoO_APPEND
nunca sobrescribirán los datos del otro; en NFS,O_APPEND
se emula buscando hasta el final antes de escribir, lo que deja la posibilidad de condiciones de carrera. No hay forma de evitar esto en NFS; cada escritor paralelo necesita escribir su propio archivo. La única forma de evitar esto es configurar un proceso de servidor en el servidor NFS, hacer que los registradores inicien sesión|nc server port
y que el servidor agregue datos entrantes al registro.Respuestas:
Ejecuté esto:
strace -o spork.out bash -c "echo 1234 >> some-file"
para resolver su pregunta. Esto es lo que encontré:No existía ningún archivo llamado "algún archivo" en el directorio en el que ejecuté el
echo
comando.fuente
Esto no solo se hace en Bash, sino que también lo exige el estándar.
De la especificación Single Unix :
Por lo tanto, cualquier shell compatible con POSIX debe hacerlo. En algunos sistemas Unix,
/bin/sh
puede ser un shell Bourne que no sea POSIX (el shell Bourne se escribió originalmente antes de queO_APPEND
se inventara), y el shell POSIX disponible normalmenteksh
estará disponiblesh
en una ubicación de ruta diferente, como la de Solaris/usr/xpg4/bin
.fuente
open()
.>>
en sí fue introducido por su predecesor, el shell Thomson.Mirando en la fuente, usa O_APPEND. Para bash 4.3.30 en la
make_cmd.c
línea 710-713, lea:fuente
Investiguemos eso usando
strace
en un sistema de archivos local (no NFS):Otros proyectiles, es decir
dash
,dash
,sh
de busybox' ymksh
se comportan de la misma manera.La opción
-e open
significa-e trace=open
rastrear solo laopen()
llamada al sistema.fuente