15 votos

¿Qué significa el último "-" (guión) en las opciones de `bash`?

En este tutorial necesitamos ejecutar el siguiente comando:

 # curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
 

¿Qué significa el último - (guión) después de bash ?

He visto muchos comandos con esto, y no pude encontrar una explicación lógica y tampoco encontré cómo reformular una búsqueda de Google para ello. ¿Es la salida del comando canalizado?

31voto

Kamil Maciorowski Puntos 897

Bash se comporta de cierta manera no estándar cuando se trata de -.

POSIX dice:

Directriz 10:
El primer -- argumento de que no es una opción-argumento debe ser aceptado como un delimitador que indica el fin de las opciones. Las siguientes argumentos deben ser tratados como operandos, incluso si empiezan con la - carácter.

[...]

Directriz 13:
Para las utilidades que el uso de operandos para representar archivos a abrirse, ya sea para lectura o escritura, el - operando debe ser usado para significar sólo estándar de entrada (o de salida estándar cuando es claro por el contexto que un archivo de salida se especifica) o un archivo de nombre -.

Y

Donde una utilidad descrita en la Cáscara y en las Utilidades de volumen de POSIX.1-2017 conforme a estas directrices está obligado a aceptar o no aceptar, el operando - significa que el estándar de entrada o de salida, este uso se explica en los OPERANDOS de la sección. De lo contrario, si dicha utilidad utiliza operandos para representar archivos, es la implementación definido si el operando - representa estándar de entrada (o de salida estándar), o por un archivo llamado -.

Pero, a continuación, man 1 bash lee:

Un -- señala el final de las opciones y desactiva la opción adicional de procesamiento. Los argumentos después de la -- son tratados como nombres de archivo y los argumentos. Un argumento de - es equivalente a --.

Así que para Bash - significa ni la entrada estándar ni un archivo, por lo tanto algo no estándar.

Ahora su caso en particular:

curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Yo sospecho que el autor de este comando puede no darse cuenta - es equivalente a -- en este caso. Yo sospecho que el autor quería asegurarse bash va a leer de la entrada estándar, que esperaban - de trabajo de acuerdo a la directriz 13.

Pero incluso si se trabaja de acuerdo a la pauta, - sería innecesario aquí porque bash detecta cuando su entrada estándar es una tubería y actúa en consecuencia (a menos -c es dada etc.).

Sin embargo, - no funciona de acuerdo a la pauta, funciona como --. Todavía -- es innecesario aquí porque no hay argumentos después de ella.

En mi opinión la última - no cambia nada. El comando sería trabajar sin él.

A ver cómo -- y - puede ser útil en general, el estudio, el ejemplo de abajo.


cat en mi Kubuntu obedece tanto a las directrices y la voy a utilizar para demostrar la utilidad de - y --.

Permitir que un archivo con nombre foo existen. Esto imprimirá el archivo:

cat foo

Permitir que un archivo con nombre --help existen. Esto no imprimir el archivo:

cat --help

Pero esto va a imprimir el archivo con el nombre --help:

cat -- --help

Esto va a concatenar el archivo con el nombre --help con lo que viene a partir de la entrada estándar:

cat -- --help -

Parece que usted realmente no necesita --, porque siempre puede pasar ./--help que será interpretado como un archivo seguro. Pero considerar

cat "$file"

cuando no se sabe de antemano lo que el contenido de la variable. Usted simplemente no puede anteponer ./ , porque puede ser una ruta absoluta y ./ rompería. Por otro lado, también puede ser un archivo de nombre --help (porque ¿por qué no?). En este caso, -- es muy útil; esto es mucho más robusto comando:

cat -- "$file"

6voto

AFH Puntos 3747

En man bash , al final de las opciones de un solo carácter hay: -

 --    A -- signals the end of options and disables further option processing.
      Any arguments after the -- are treated as filenames and arguments. An
      argument of - is equivalent to --.
 

Si ha citado el comando completo, no veo ninguna razón para usar - después de bash en esta instancia, pero no hace daño.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: