Variaciones de argumentos de línea de comando de Linux

Variaciones de argumentos de línea de comando de Linux

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 widgetque 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 widgetherramienta (ya existente) su fizzargumento?

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 shy man bashpara obtener detalles sobre cómo manejan esas cosas.

Sin embargo, en última instancia, widgetobtiene el argumento -fizzexactamente --fizzcomo está escrito, como una cadena. Decide qué hacer con él.

Existen algunos estándares: muchas variantes de getoptsy poptque procesan esos argumentos widgety tienen cierto grado de comportamiento "estándar".

Sin embargo , nada impide al autor widgetinventar su propio estándar.

Entonces, finalmente, si usted es el autor widgeto modifica el código fuente, puede absolutamente hacer que se trate #f#como el fizzargumento. 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á *.jpga image1.jpg image2.jpg, por lo que lsse 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 widgetherramienta 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.

información relacionada