Tengo un programa bash que escribirá en un archivo de salida. Este archivo puede o no existir, pero el script debe verificar los permisos y fallar anticipadamente. No puedo encontrar una manera elegante de hacer que esto suceda. Esto es lo que he intentado.Bash: cree un archivo si no existe, de lo contrario verifique si es grabable
set +e touch $file set -e if [ $? -ne 0 ]; then exit;fi
guardo en set -e
para este script por lo que falla si alguna vez hay un error en cualquier línea. ¿Hay alguna manera más fácil de hacer el script anterior?
Debo advertirle que hay una condición de carrera. No puede verificar un error temprano. El archivo podría haber estado allí en el momento en que lo verificó, pero se eliminó cuando está a punto de comenzar a escribir en él. O peor aún, el permiso cambió. Te recomiendo que abras el archivo para escribir y obtener el descriptor. Si esa operación tuvo éxito, estás bien.En ese caso, no importa si el archivo se eliminó o no, OS mantendrá abierto el inodo en caso de eliminación y simplemente lo "tocará" desde el nombre del archivo. –
Ayúdame a comprender. Si el archivo de registro se elimina mientras el script se está ejecutando, ¿los intentos de escribir en él tendrán éxito si abro un descriptor? Pero el archivo se borra ... ¿a dónde van los datos? ¿No quisiera que fallara en esos raros casos? – User1
Si se elimina un archivo (más específicamente, no vinculado) mientras está abierto para escritura, permanece en el sistema de archivos hasta que se cierran todos los manejadores de archivos, ya sea explícitamente o por el proceso (s) que sale. Si su proceso es lo único que se escribe en el archivo, continuará llenando el disco, pero no se podrá abrir (porque no hay entrada de directorio) por ningún otro proceso. – Phil