En una secuencia de comandos de shell, ¿cómo puedo probar de forma fácil y no invasiva el acceso de escritura a un archivo sin intentar modificarlo?
Podría analizar la salida de stat
, pero eso parece realmente complejo, y quizás frágil, aunque no estoy seguro de cuánto difiere la salida de estadísticas entre implementaciones y tiempo.
Podría agregar al final del archivo y ver si eso tiene éxito, pero eso es potencialmente peligroso, por dos razones que puedo pensar:
- Ahora tengo que eliminar la adición, y en caso de que algún otro proceso escriba en el archivo, esto inmediatamente no será trivial ya que mi línea ya no es la última.
- Cualquier proceso de lectura del archivo puede tener requisitos arbitrarios sobre el contenido de ese archivo, y es posible que haya roto esa aplicación.
fuente
man test
oman [
type -a
test
usos de origeneuidaccess
que simplemente comprueba los bits de permiso . ¿No hay otros factores (por ejemplo, SELinux) que podrían prohibir el acceso de escritura?&&
y||
tienen la misma precedencia. Se evalúan de izquierda a derecha.Otro enfoque:
Esto intentará abrir el archivo para agregarlo y, si tiene éxito, no ejecutará ningún comando (es decir, ejecutará un comando nulo ) con salida al archivo.
Tenga en cuenta que esto crea un archivo vacío si no existiera.
El
-w
operador deltest
comando podría simplemente hacer unstat
y luego tratar de averiguar si parece que debería tener acceso. Mi alternativa (arriba) es más confiable que eltest
enfoque en algunas condiciones especiales, porque obliga a que el kernel realice la verificación de acceso en lugar del shell. Por ejemplo,stat
podría devolver un valor de modo que es engañoso.fuente
touch
un archivo que poseía pero al que no tenía acceso de escritura, y lo logré. Supongo quechmod
es el archivo ychmod
lo devuelve. Entoncestouch
parece ser absolutamente inútil como respuesta a la pregunta.vim
tiene el comportamiento de cambiar rápidamente los permisos cuando se ve obligado a escribir en archivos de solo lectura. Verifiqué constrace
,touch
'sopen
falla conEACCES
, pero la llamada posterior alutimensat
éxito tiene éxito, por lo que creo quetouch
en general todo sale con éxito.utimensat(2)
dice: " Requisitos de permisos: 1. acceso de escritura (o) 2. la identificación de usuario efectiva de la persona que llama debe coincidir con el propietario del archivo, ...".>> file
no es portátil (por ejemplo, ejecuta el NULLCMD en zsh), utilícelotrue >> file
en su lugar. Y si el archivo es una tubería con nombre, tiene efectos secundarios desagradables.G-man tiene razón:
[ -w ]
no siempre dirá la verdad. Aquí para hacer frente a un archivo no existente y al mensaje de permiso denegado del shell:Actualización : Parece aterrador, ¿no? Bueno, lo es. Hmm ... cómo expresarlo ... NO UTILICE ESTO, a menos que sepa perfectamente que se encuentra en las condiciones en que solicita que funcione como se espera. Ver el comentario de Stephane.
¿Qué concluir, entonces? Incluso si
[ -w ]
no dice la verdad, es el único comando que está destinado a hacer el trabajo. Si no es así, bueno, lo culparemos, escribiremos informes de errores y funcionará en el futuro. Mejor verifique las condiciones bajo las cuales funciona y usa[ -w ]
; escribir código especial para casos especiales. Las soluciones tienen sus propias condiciones.es la mejor a priori .
fuente
test -w
en la mayoría de las implementaciones, los usosaccess(2)
deberían ser suficientes para probar los permisos.