Comienzo en el directorio vacío.
$ touch aFile
$ ls
aFile
Luego tengo lsdos 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 &>>outputaquí? (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/shde Ubuntu se analizarlo. Para que esté en desuso, puedes mirar aquí , aunque no pretendo que sea ningún tipo de autoridad. Sinbashembargo, 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
bararchivo 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>&1que 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
baren elfoo >>bar 2>&1que se escriben en, al mismo tiempo desde dos lugares separados siendo bastante bajo. Pero por su>>bar 2>>barsolo lo aumentó en una docena de órdenes de magnitud, sin ninguna razón.[1] "Descripciones de archivos abiertos" en la jerga POSIX.
fuente
O_APPENDde 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
filese 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
hellocadena se escribe primero (con una nueva línea de terminación), y luego la cadenaabcseguida de una nueva línea se escribe a partir del error estándar, sobrescribiendo elhell. El resultado es la cadenaabccon una nueva línea, seguida de lo que queda de la primeraechosalida, unaoy una nueva línea.Intercambiar los dos
echoalrededor de la herida produce solohelloen el archivo de salida, ya que esa cadena se escribe en último lugar y es más larga que laabccadena. 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.sho 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>&1responder 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