Bash: redirige al archivo, siempre crea nuevos

8

En bash, un enlace de comando

echo test > actual.txt

reemplazará el contenido del archivo llamado actual.txtcon "prueba" y creará el archivo si no existe. Sin embargo, si el archivo existe, bash simplemente lo abrirá, truncará y escribirá los nuevos contenidos en el archivo.

Específicamente, el comando de redireccionamiento falla en este escenario:

ln -s /some/illegal/path link.txt
echo test > link.txt

Bash 4.4.12 me da el mensaje de error confuso link.txt: No such file or directory.

Una forma de evitar esto es asegurarse de eliminar el archivo antes de ejecutar el comando redirigido.

rm link.txt && echo test > link.txt

Sin embargo, me preguntaba si había algún ajuste de las opciones de bash o el operador de redireccionamiento que evitará este modo de falla. ¿Algunas ideas?

itsadok
fuente
¿Qué sucede si link.txthay un enlace a /dir/filedonde /dirhay un archivo de tipo directorio en el que tiene permiso de escritura y búsqueda, pero /dir/fileno existe (y la redirección lo crearía sin un mensaje de error)? ¿Qué pasa si /dir/fileexiste pero no es un archivo normal (dispositivo, quince, directorio ...), o si no tiene permiso de escritura o de búsqueda /dir?
Stéphane Chazelas

Respuestas:

7

Intentar escribir en un enlace simbólico muerto es equivalente a intentar escribir en una ruta que no existe. No hay forma de "ajustar" la redirección de salida para crear la ruta (incluidos los directorios intermedios) bash, y no hay opciones de shell bashque lo hagan automático.

Si la ruta intermedia existe, pero no existe el punto final del enlace, la redirección la creará.

Puedes hacer algo como

if [ -h file ] && [ ! -f file ]; then
    rm file
fi

para probar si "archivo" es un enlace simbólico ( -h) y si se refiere a un archivo normal que existe ( -f). Si se trata de un enlace simbólico pero no hace referencia a un archivo, lo elimina.

Kusalananda
fuente
1
El punto de mi pregunta era que no estoy tratando de escribir a nada. Quiero crear un nuevo archivo llamado link.txt, y resulta que hay un enlace simbólico en la misma ubicación. Para poner esto en forma de pregunta: ¿por qué molestarme con la prueba si voy a sobrescribir el archivo en la siguiente línea? Solo puedo hacer rm -fy tendrá el mismo efecto.
itsadok
3
@itsadok Ah. Si. Hacerlo rm -f filenameantes de escribir con la redirección también resolvería su problema. Pero también depende de si desea que esté en el directorio actual o en el directorio donde se encuentra el punto final del enlace simbólico.
Kusalananda
Todavía podría faltarle los permisos al rmarchivo o escribir en él. Como en muchos casos, no puedes prepararte para todo. Debe evaluar qué casos realmente espera (aunque solo sea en raras ocasiones) y, por lo tanto, manejar, qué casos considera tan improbables que no los maneja a propósito, y aceptar que habrá una cierta cantidad de casos que no considere y por lo tanto no puede manejar.
Alfe