¿Cuál es la diferencia entre las marcas de guión simple y guión doble en los comandos de shell?
70
Soy nuevo en el trabajo en el shell y el uso de estos comandos parece arbitrario. ¿Hay alguna razón por la cual una bandera tiene un solo guión y otra podría tener un guión doble?
Un solo guión puede ser seguido por múltiples banderas de un solo carácter. Un guión doble prefija una opción única de varios caracteres.
Considere este ejemplo:
tar -czf
En este ejemplo, -czfespecifica tres banderas de un solo carácter: c, z, y f.
Ahora considere otro ejemplo:
tar --exclude
En este caso, --excludeespecifica una opción única de varios caracteres denominada exclude. El guión doble de ambigüedad el argumento de línea de comandos, asegurando que tarlo interpreta como excludelugar de una combinación de e, x, c, l, u, d, y e.
@kylex, no, ya que no hay una opción larga llamada solo "c" y la - significa una opción larga, no sigue una sola opción de carácter.
psusi
13
A veces, incluso los comandos largos pueden ser de un solo guión. Por ejemplo, 'cdrecord' usa todos los comandos de un solo guión (-eject -dao ...). Todo depende del programa, pero la mayoría (!) De ellos usan - para comandos simples y - para múltiples caracteres (largos)
mulaz
8
@mulaz, sí, cdrecord hace bastantes tonterías.
psusi
10
También tenga en cuenta: el uso por sí solo generalmente significa el final de las opciones. ver aquí para más información: unix.stackexchange.com/questions/11376/…
Sirex
3
@killjoy, porque ya sea por ignorancia o por elección, los autores de esos programas no siguieron la convención, por supuesto. Tal como se cdrecordmencionó hace años en los comentarios anteriores.
psusi
17
Todo depende del programa. Por lo general, "-" se usa para las opciones "cortas" (una letra, -h), y "-" se usa para las opciones "largas" (er) (--help).
Las opciones cortas generalmente se pueden combinar (por lo que "-h -a" es lo mismo que "-ha")
En sistemas similares a Unix, el guión ASCII menos se usa comúnmente para especificar opciones. El carácter suele ir seguido de una o más letras. Un argumento que es un solo guión, menos por sí mismo sin letras, generalmente especifica que un programa debe manejar los datos que provienen de la entrada estándar o enviar datos a la salida estándar. Se usan dos guiones – menos caracteres (-) en algunos programas para especificar "opciones largas" donde se usan nombres de opciones más descriptivos. Esta es una característica común del software GNU.
Entonces, ¿por qué es java -version y ant -version, entonces?
killjoy
7
Realmente es una convención. Sin embargo, puede ayudar a los analizadores a conocer de manera más eficiente las opciones pasadas al programa. Además, hay utilidades ordenadas que pueden ayudar a analizar estos comandos, como getopt(3)el no estándar getopt_long(3)para ayudar a analizar los argumentos de un programa.
Es bueno, ya que podemos tener múltiples opciones cortas combinadas, como dicen otras respuestas, como tar -xzf myfile.tar.gz.
Si hubiera un argumento "lisa" para ls, probablemente tendría un significado diferente para escribir ls -lisaque ls --lisa. Los primeros son los l, i, s, y alos parámetros, no la palabra.
De hecho, podría escribir ls -l -i -s -a, lo que significa exactamente lo mismo que ls -lisa, pero eso dependería del programa.
También hay programas que no obedecen esta convención. Lo más notable para mi vista, ddy gcc.
Respuestas:
Un solo guión puede ser seguido por múltiples banderas de un solo carácter. Un guión doble prefija una opción única de varios caracteres.
Considere este ejemplo:
En este ejemplo,
-czf
especifica tres banderas de un solo carácter:c
,z
, yf
.Ahora considere otro ejemplo:
En este caso,
--exclude
especifica una opción única de varios caracteres denominadaexclude
. El guión doble de ambigüedad el argumento de línea de comandos, asegurando quetar
lo interpreta comoexclude
lugar de una combinación dee
,x
,c
,l
,u
,d
, ye
.fuente
cdrecord
mencionó hace años en los comentarios anteriores.Todo depende del programa. Por lo general, "-" se usa para las opciones "cortas" (una letra, -h), y "-" se usa para las opciones "largas" (er) (--help).
Las opciones cortas generalmente se pueden combinar (por lo que "-h -a" es lo mismo que "-ha")
fuente
fuente
Realmente es una convención. Sin embargo, puede ayudar a los analizadores a conocer de manera más eficiente las opciones pasadas al programa. Además, hay utilidades ordenadas que pueden ayudar a analizar estos comandos, como
getopt(3)
el no estándargetopt_long(3)
para ayudar a analizar los argumentos de un programa.Es bueno, ya que podemos tener múltiples opciones cortas combinadas, como dicen otras respuestas, como
tar -xzf myfile.tar.gz
.Si hubiera un argumento "lisa" para
ls
, probablemente tendría un significado diferente para escribirls -lisa
quels --lisa
. Los primeros son losl
,i
,s
, ya
los parámetros, no la palabra.De hecho, podría escribir
ls -l -i -s -a
, lo que significa exactamente lo mismo quels -lisa
, pero eso dependería del programa.También hay programas que no obedecen esta convención. Lo más notable para mi vista,
dd
ygcc
.fuente
las opciones cortas se pueden combinar en un solo argumento;
Si permitimos opciones largas con un solo guión, causa ambigüedad. Para resolver esto, usamos doble guión para opciones largas.
fuente