Soy nuevo en Linux y tengo algunas preguntas sobre los argumentos de la línea de comandos:
Digamos que hay una herramienta de línea de comandos llamada widget
que toma un argumento llamado fizz
. He visto todos los diferentes tipos de argumentos:
widget -fizz
widget --fizz
widget \fizz
widget -f
¿Cuál es la diferencia en cómo se usan? ¿La herramienta de línea de comandos decide cómo determinarlos de manera diferente, o Linux sabe que todos significan lo mismo, pero los envía a la aplicación de manera diferente?
¿Puedo personalizar mi propia forma de pasarle a la widget
herramienta (ya existente) su fizz
argumento?
widget #f#
¡Gracias de antemano!
Respuesta1
¿Cuál es la diferencia en cómo se usan?
Eso depende enteramente del programa, porque...
¿La herramienta de línea de comandos decide cómo determinarlos de manera diferente, o Linux sabe que todos significan lo mismo, pero los envía a la aplicación de manera diferente?
...los argumentos del proceso vienen como una serie de cadenas individuales.
Aquí hay dos cosas involucradas: una es el shell, que analiza la entrada que escribe y ejecuta el proceso. Eso, por ejemplo, divide la cadena en espacios en blanco y los pasa a widget
. Consulte, por ejemplo, man sh
y man bash
para obtener detalles sobre cómo manejan esas cosas.
Sin embargo, en última instancia, widget
obtiene el argumento -fizz
exactamente --fizz
como está escrito, como una cadena. Decide qué hacer con él.
Existen algunos estándares: muchas variantes de getopts
y popt
que procesan esos argumentos widget
y tienen cierto grado de comportamiento "estándar".
Sin embargo , nada impide al autor widget
inventar su propio estándar.
Entonces, finalmente, si usted es el autor widget
o modifica el código fuente, puede absolutamente hacer que se trate #f#
como el fizz
argumento. Sin embargo, no puedes hacerlo sin cambiar el programa.
Respuesta2
¿La herramienta de línea de comandos decide cómo determinarlos de manera diferente, o Linux sabe que todos significan lo mismo, pero los envía a la aplicación de manera diferente?
Es trabajo del ejecutable, o función, evaluar sus argumentos. El shell (no Linux, sino bash
, csh
, etc.) no interferirá en absoluto con estos argumentos.
Esto significa que cada argumento se trata de manera diferente en su caso. Sin embargo, tenga en cuenta que el shell realizaexpansionesosustitucionesantes de que el comando obtenga sus argumentos. Cuando, por ejemplo, tienes una carpeta con dos imágenes JPG y escribes:
ls *.jpg
Luego, el shell se expandirá *.jpg
a image1.jpg image2.jpg
, por lo que ls
se pasarán los siguientes argumentos:
ls image1.jpg image2.jpg
Aparte de eso, no se puede modificar un script para que tome otro argumento que el que ya está compilado o escrito en el ejecutable, aparte de reescribir el código fuente.
Consulte también la siguiente pregunta:
¿Cuál es la diferencia entre un guión y dos guiones para los parámetros del símbolo del sistema?
Respuesta3
En primer lugar, es poco probable que vea algún argumento que comience con en \
Linux porque en la mayoría de los shells se trata de un carácter de escape, utilizado para espacios de escape y otros caracteres que son significativos para el shell ( $
,,, etc.).""
()
El shell de Linux (Bash en la mayoría de las distribuciones) simplemente pasa cada argumento separado por espacios como cadenas al proceso. Lo que el proceso decida hacer con ellos es elección del programador.
Por lo general, el -
prefijo indica una opción corta (como -h
) y el prefijo --
indica una versión más larga (como --help
). Esto es parte del estándar POSIX que utilizan la mayoría de los programas de Linux, que fue heredado de las primeras herramientas de Unix. Ver eloptarartículo en Wikipedia para más información.
Para su última pregunta, no, no puede modificar la forma en que la widget
herramienta interpreta estos argumentos, a menos que modifique su código fuente.
En algunos sistemas Unix hay una ingeniosa utilidad llamadapargosque le permite ver todos los argumentos que se pasaron al proceso. En Linux, puedes replicar esto usando
ps eww -p 12345
Donde 12345 es el identificador de proceso (PID). Veresta respuestapara una alternativa.