Comienzo en el directorio vacío.
$ touch aFile
$ ls
aFile
Luego tengo ls
dos argumentos, uno de los cuales no está en este directorio. Redirijo ambas secuencias de salida a un archivo llamado output
. Lo uso >>
para evitar escribir simultáneamente.
$ ls aFile not_exist >>output 2>>output
$ cat output
ls: cannot access 'not_exist': No such file or directory
aFile
Lo que parece funcionar. ¿Hay algún peligro para este enfoque?
io-redirection
stdout
stderr
salida_estado
fuente
fuente
ls aFile not_exist &>>output
aquí? (Nota, supongo que está usando bash .)&>>
NO es estándar. Es una sintaxis ambigua y DEPRECADA que funciona de manera diferente en diferentes shells. Me pregunto de dónde sacarán sus cosas.ls &>>foo ...
deben ser analizados como dos comandsls &
y>>foo ...
, y esta es la forma más conchas como el/bin/sh
de Ubuntu se analizarlo. Para que esté en desuso, puedes mirar aquí , aunque no pretendo que sea ningún tipo de autoridad. Sinbash
embargo, puede preguntar a los mantenedores si consideran que usar eso es una buena idea.Respuestas:
No, no es tan seguro como el estándar
>>bar 2>&1
.Cuando estas escribiendo
está abriendo el
bar
archivo dos vecesO_APPEND
, creando dos objetos de archivo completamente independientes [1], cada uno con su propio estado (puntero, modos abiertos, etc.).Esto es muy diferente a lo
2>&1
que simplemente está llamando a la llamada deldup(2)
sistema, y hace que los alias intercambiables stderr y stdout para el mismo objeto de archivo.Ahora, hay un problema con eso:
Generalmente, usted puede contar con la probabilidad de que el archivo como
bar
en elfoo >>bar 2>&1
que se escriben en, al mismo tiempo desde dos lugares separados siendo bastante bajo. Pero por su>>bar 2>>bar
solo lo aumentó en una docena de órdenes de magnitud, sin ninguna razón.[1] "Descripciones de archivos abiertos" en la jerga POSIX.
fuente
O_APPEND
de todos modos es una especie de fallo, bastante oneroso de implementar correctamente.O_APPEND
, el cliente primero recuperará el tamaño "real" del archivo del servidor ("revalidará" el inodo) y luego realizará la actualización de inodo de búsqueda + escritura + almacenamiento en caché, y solo la última parte es hecho bajo bloqueos, lo que significa que la primera parte aún podría recuperar un tamaño obsoleto del servidor y anular el correcto del inodo local / en caché. Mismo problema conlseek(SEEK_END)
.¿Qué pasa cuando lo haces?
es que
file
se abrirá para agregar dos veces. Esto es seguro en un sistema de archivos POSIX. Cualquier escritura que le ocurra al archivo cuando se abre para agregarla ocurrirá al final del archivo, independientemente de si los datos provienen del flujo de salida estándar o del flujo de error estándar.Esto se basa en el soporte para operaciones de escritura de adición atómica en el sistema de archivos subyacente. Algunos sistemas de archivos, como NFS, no admiten el agregado atómico. Consulte, por ejemplo, la pregunta "¿El archivo se agrega atómico en UNIX?" En StackOverflow.
Utilizando
funcionaría incluso en NFS sin embargo.
Sin embargo, usando
no es seguro, ya que el shell truncará el archivo de salida (dos veces) y cualquier escritura que ocurra en cualquiera de las secuencias sobrescribirá los datos ya escritos por la otra secuencia.
Ejemplo:
La
hello
cadena se escribe primero (con una nueva línea de terminación), y luego la cadenaabc
seguida de una nueva línea se escribe a partir del error estándar, sobrescribiendo elhell
. El resultado es la cadenaabc
con una nueva línea, seguida de lo que queda de la primeraecho
salida, unao
y una nueva línea.Intercambiar los dos
echo
alrededor de la herida produce solohello
en el archivo de salida, ya que esa cadena se escribe en último lugar y es más larga que laabc
cadena. El orden en que ocurren las redirecciones no importa.Sería mejor y más seguro usar los más idiomáticos.
fuente
>>
proviene), donde>>
se abriría para escribir y buscar hasta el final (supongo que O_APPEND aún no se inventó en ese momento). Incluso en Solaris 10,/bin/sh -c '(echo a; echo b >&2) >> file 2>> file; cat file'
salidasb
.sh
o con su sistema de archivos?>>
estaba haciendo originalmente, no se estaba abriendo con O_APPEND, se estaba abriendo sin buscar el final. No es tanto un problema, es lo que estaba haciendo y fue documentado para hacerlo.Depende de lo que quieras lograr. Depende de usted decidir si está bien tener errores en el mismo archivo que la salida. Esto es solo guardar texto en un archivo con la funcionalidad del shell que le permite redirigir como lo desee. No hay un sí o un no absoluto. Como todo en Linux se puede hacer de varias maneras, esta es mi forma de
ls notExistingFile existingFile >> output 2>&1
responder la pregunta: en términos de la redirección en sí, sí, es perfectamente seguro.fuente
>
lugar de>>
sobrescribirá algunos caracteres. Entonces, no es solo que el shell me permite redirigir, porque cuando redirecciono con>
, el resultado es diferente. Entonces hay matices con>
, ¿hay alguno con>>
?>
: sobrescribir.>>
- agregar