Bash se comporta de una manera algo no estándar cuando se trata de -
.
POSIX dice:
Pauta 10:
El primer --
argumento que no es un argumento de opción debe aceptarse como un delimitador que indica el final de las opciones. Los siguientes argumentos deben tratarse como operandos, incluso si comienzan con el -
carácter.
[...]
Directriz 13:
Para las utilidades que usan operandos para representar archivos que se abrirán para lectura o escritura, el -
operando debe usarse para significar solo entrada estándar (o salida estándar cuando está claro desde el contexto que se está especificando un archivo de salida) o un archivo llamado -
.
Y
Cuando una utilidad descrita en el volumen de Shell y Utilidades de POSIX.1-2017 como conforme a estas pautas se requiere para aceptar, o no aceptar, el operando -
para significar entrada o salida estándar, este uso se explica en la sección OPERANDS. De lo contrario, si dicha utilidad utiliza operandos para representar archivos, se define la implementación si el operando -
significa entrada estándar (o salida estándar) o un archivo llamado -
.
Pero luego man 1 bash
lee:
A --
señala el final de las opciones y desactiva el procesamiento adicional de opciones. Cualquier argumento después de la --
se trata como nombres de archivo y argumentos. Un argumento de -
es equivalente a --
.
Entonces, para Bash -
no significa entrada estándar ni un archivo, por lo tanto, algo no estándar.
Ahora tu caso particular:
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
Yo sospecho que el autor de este comando no se dan cuenta -
es equivalente a --
en este caso. Yo sospecho que el autor quería asegurarse de que bash
va a leer desde la entrada estándar, que esperaban -
al trabajo de acuerdo con la directriz 13.
Pero incluso si funcionara de acuerdo con la directriz, -
sería innecesario aquí porque bash
detecta cuándo su entrada estándar es una tubería y actúa en consecuencia (a menos que -c
se indique, etc.).
Sin embargo -
, no funciona de acuerdo con la directriz, funciona como --
. Todavía --
es innecesario aquí porque no hay argumentos después.
En mi opinión, el último -
no cambia nada. El comando funcionaría sin él.
Para ver cómo --
y -
puede ser útil en general, estudie el siguiente ejemplo.
cat
en mi Kubuntu obedece ambas pautas y lo usaré para demostrar la utilidad de -
y --
.
Deje que foo
exista un archivo llamado . Esto imprimirá el archivo:
cat foo
Deje que --help
exista un archivo llamado . Esto no imprimirá el archivo:
cat --help
Pero esto imprimirá el archivo llamado --help
:
cat -- --help
Esto concatenará el archivo nombrado --help
con lo que provenga de la entrada estándar:
cat -- --help -
Parece que realmente no lo necesita --
, porque siempre puede pasar lo ./--help
que seguramente se interpretará como un archivo. Pero considera
cat "$file"
cuando no sabes de antemano cuál es el contenido de la variable. No puede simplemente anteponerse ./
a él, porque puede ser un camino absoluto y ./
lo rompería. Por otro lado, puede ser un archivo llamado --help
(porque ¿por qué no?). En este caso --
es muy útil; Este es un comando mucho más robusto:
cat -- "$file"