GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué rm manual dice que podemos ejecutarlo sin ningún argumento, cuando esto no es cierto?

La sinopsis estándar del rm La utilidad se especifica en el estándar POSIX como

rm [-iRr] file...
rm -f [-iRr] [file...]

En su primera forma, requiere al menos un operando de archivo, pero en su segunda forma no lo requiere.

Haciendo rm -f sin operandos de archivo no es un error:

$ rm -f
$ echo "$?"
0

... pero no hace mucho.

El estándar dice que para el -f opción, el rm la utilidad debería...

No pida confirmación. No escriba mensajes de diagnóstico ni modifique el estado de salida en el caso de que no haya operandos de archivo, o en el caso de operandos que no existan. Cualquier aparición anterior de -i la opción será ignorada.

Esto confirma que debe ser posible ejecutar rm -f sin ningún operando de nombre de ruta y que esto no es algo que haga rm salir con un mensaje de diagnóstico ni un estado de salida distinto de cero.

Este hecho es muy útil en un script que intenta eliminar una serie de archivos como

rm -f -- "[email protected]"

donde "[email protected]" es una lista de rutas que pueden o no estar vacías, o que pueden contener rutas que no existen.

(rm -f seguirá generando un mensaje de diagnóstico y saldrá con un estado de salida distinto de cero si hay problemas de permisos evitando que se elimine un archivo con nombre).

Sin embargo, ejecutar la utilidad sin operandos de opción ni de nombre de ruta es un error:

$ rm
usage: rm [-dfiPRrv] file ...
$ echo "$?"
1

Lo mismo es válido para GNU rm (lo anterior muestra OpenBSD rm ) y otras implementaciones de la misma utilidad, pero el mensaje de diagnóstico exacto y el estado de salida distinto de cero pueden ser diferentes (en Solaris el valor es 2 y en macOS es 64, por ejemplo).

En conclusión, el GNU rm manual puede ser un poco impreciso ya que es cierto que con alguna opción (-f , que es una opción opcional), el operando de nombre de ruta es opcional.

desde la edición de 2016, después de la resolución de este error, consulte la edición anterior como referencia.
POSIX es el estándar que define qué es un sistema Unix y cómo se comporta. Este estándar es publicado por The Open Group. Consulte también la pregunta "¿Qué es exactamente POSIX?".


Técnicamente, la sinopsis es correcta, pero es confusa. Hay casos en los que no se necesita un nombre de archivo:

rm --help
rm --version

(al usar GNU rm ). Todos los demás casos requieren un nombre de archivo.

Otras versiones de rm mostrar el archivo como no opcional, p. ej. en la página de manual de OpenBSD.

Una sinopsis más precisa para GNU rm mostraría las tres variantes:

rm [opciones ...] archivo ...
rm --help
rm --version


Linux
  1. ¿Por qué la sustitución del proceso Bash no funciona con algunos comandos?

  2. ¿Por qué no puedo dividir un archivo .ape?

  3. No se puede ejecutar el comando de configuración:¿"no existe tal archivo o directorio"?

  4. ¿Por qué `zip` en un bucle For funciona cuando el archivo existe, pero no cuando no existe?

  5. El comando "java" no ejecuta la JVM que se ha instalado

¿Por qué sale esta canalización de shell?

¿Por qué stdout necesita un vaciado explícito cuando se redirige al archivo?

gdb no alcanza ningún punto de interrupción cuando lo ejecuto desde el interior del contenedor Docker

¿Por qué dice No debemos incluir límites? en dirent.h?

¿Por qué wget'ing una imagen me da un archivo, no una imagen?

¿Por qué esta expresión regular no funciona en Linux?