Sé que rm -f file1
se eliminará con fuerza file1
sin preguntarme.
También sé que rm -i file1
primero me preguntará antes de eliminarfile1
Ahora, si ejecuta rm -if file1
, esto también se eliminará a la fuerza file1
sin preguntarme.
Sin embargo, si ejecuta rm -fi file1
, me preguntará antes de eliminar file1
.
Entonces, ¿es cierto que al combinar opciones de comando, prevalecerá el último? como rm -if
, entonces -f
tendrá prioridad, pero rm -fi
entonces -i
tendrá prioridad.
El ls
comando, por ejemplo, no importa si dijiste ls -latR
o ls -Rtal
.
Así que supongo que solo importa cuando tienes opciones de comando contradictorias como rm -if
, ¿es correcto?
command-line
rm
command
options
Alkabary
fuente
fuente
Respuestas:
Cuando se usa
rm
con ambos-i
y-f
opciones, se ignorará el primero. Esto está documentado en el estándar POSIX :y también en la
info
página de GNU :Veamos qué pasa debajo del capó:
rm
procesa su opción congetopt(3)
, específicamentegetopt_long
. Esta función procesará los argumentos de la opción en la línea de comando (**argv
) en orden de aparición:Esta función generalmente se llama en un bucle hasta que se procesen todas las opciones. Desde esta perspectiva de funciones, las opciones se procesan en orden. Sin embargo, lo que sucede realmente depende de la aplicación, ya que la lógica de la aplicación puede elegir detectar opciones en conflicto, anularlas o presentar un error. Para el caso de
rm
y las opcionesi
yf
, se sobrescriben perfectamente entre sí. Derm.c
:Ambas opciones establecen las mismas variables, y el estado de estas variables será la última opción en la línea de comando. El efecto de esto está en línea con el estándar POSIX y la
rm
documentación.fuente
rm
). Creo que es raro que un comando tome la primera configuración de una opción e ignore los argumentos que cambiarían una opción ya establecida.Sí, para
rm
esto es válido. Si la última opción anula a las anteriores, depende del programa individual en sí. Desde 'info rm'Como pista general:
info
generalmente es más detallado queman
, lo que en sí mismo suele ser más detallado que la--help
opción.fuente
No hay "precedencia" para las banderas, cada programa las maneja como lo desea. La mayoría hace un esfuerzo para recopilar todas las marcas y verificar conflictos, para las herramientas estándar (como las mencionadas
rm(1)
), los estándares relevantes pueden exigir algo (pero, una vez más, su versión particular puede ser descuidada al interpretar casos de esquina del estándar / no obtener una prueba específica para ellos).Para el programador que escribe el programa, es más fácil considerar los argumentos (banderas y otros) en estricto orden de izquierda a derecha, y tal vez rescatarlos al tocar algún inconveniente. Si usa una biblioteca para manejar banderas (por ejemplo
getopt(3)
, hay varias versiones flotando), el programador presumiblemente hace lo que resulta más fácil / natural. Los programadores son personas, las personas son flojas (o al menos no les gusta pensar en la explosión combinatoria).fuente