En bash, un enlace de comando
echo test > actual.txt
reemplazará el contenido del archivo llamado actual.txt
con "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?
bash
io-redirection
symlink
itsadok
fuente
fuente
link.txt
hay un enlace a/dir/file
donde/dir
hay un archivo de tipo directorio en el que tiene permiso de escritura y búsqueda, pero/dir/file
no existe (y la redirección lo crearía sin un mensaje de error)? ¿Qué pasa si/dir/file
existe pero no es un archivo normal (dispositivo, quince, directorio ...), o si no tiene permiso de escritura o de búsqueda/dir
?Respuestas:
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 shellbash
que 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
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.fuente
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 hacerrm -f
y tendrá el mismo efecto.rm -f filename
antes 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.rm
archivo 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.