¿Cuál es la magia de "-" (un guión) en los parámetros de la línea de comandos?

101

Ejemplos:

  • Cree una imagen ISO y grábela directamente en un CD.

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • Cambia al directorio anterior.

    cd -

  • Escuche en el puerto 12345 y elimine los datos enviados.

    nc -l -p 12345 | tar xvzf -

¿Cuál es el propósito del tablero y cómo lo uso?

chemila
fuente

Respuestas:

111

Si te refieres al desnudo -al final del tarcomando, eso es común en muchos comandos que quieren usar un archivo.

Le permite especificar una entrada o salida estándar en lugar de un nombre de archivo real .

Ese es el caso de su primer y tercer ejemplo. Por ejemplo, el cdrecordcomando toma la entrada estándar (el flujo de imagen ISO producido por mkisofs) y la escribe directamente en /dev/dvdrw.

Con el cdcomando, cada vez que cambia de directorio, almacena el directorio del que proviene. Si lo hace cdcon el -"nombre de directorio" especial , usa ese directorio recordado en lugar de uno real. Puede cambiar fácilmente entre dos directorios con bastante rapidez al usar eso.

Otros comandos pueden tratarse -como un valor especial diferente .

paxdiablo
fuente
9
tenga en cuenta que también puede usar -para las ramas de git, es decir, puede volver a su rama anterior congit checkout -
snappieT
3
¿En qué parte de los documentos tar se explica que es compatible? ¿Cómo sé qué comandos lo admiten?
1
Si un comando tiene un significado especial para -, puede encontrar su explicación en la página de manual.
Codeforester
su - #make the shell a login shell
atongsa
Encuentro un comando como este muy curioso: tar -cvf - / home | aescrypt -e -p manzanas -> backup_files.tar.aes que de hecho es tar -cvf - / home | aescrypt -e -p manzanas -o backup_files.tar.aes - porque la canalización char | debería hacer innecesaria la presencia del último guión. Pero sin el último guión el comando falla. Suena ilógico. ¿Puede alguien darme una referencia donde se explica el significado del guión desnudo en las líneas de comando? No puedo encontrar ninguno.
elmclose
22

No es magia. Algunos comandos se interpretan -como si el usuario desea leer desde stdin o escribir en stdout; no tiene nada de especial en el caparazón.

Ignacio Vázquez-Abrams
fuente
9
Excepto en el caso de cd -; bash(1)maneja cd -como si lo hubiera escrito cd $OLDPWD.
sarnold
6
@sarnold Pero el punto es el mismo cd: un comando integrado en el shell, interpreta un guión en sí. Sin "magia" :-)
2
@pst, claro, no hay magia (es todo código justo :), pero no es algo especial a la cáscara.
sarnold
13

Redirección desde o hacia stdino stdout.

Ver: http://tldp.org/LDP/abs/html/special-chars.html#DASHREF2

Ry-
fuente
Como siempre, el ABS debe tomarse con un grano de sal. Por ejemplo, se supone que hay redirección aquí, pero esto es distinto de operadores de redirección de la concha ( <, >, |, etc.).
tripleee
9

-significa exactamente lo que cada comando quiere que signifique. Hay varias convenciones comunes, y ha visto ejemplos de la mayoría de ellas en otras respuestas, pero ninguna de ellas es 100% universal.

No hay nada mágico en el -personaje en lo que respecta al shell (excepto que el propio shell y algunos de sus comandos integrados como cdy echo, lo usan de manera convencional). Algunos personajes, como \, 'y ", son "mágicos" y tienen significados especiales dondequiera que aparezcan. Estos son "metacaracteres de shell". -no es así.

Para ver cómo se usa un comando determinado -, lea la documentación de ese comando .

Keith Thompson
fuente
7

La magia está en la convención. Durante milenios, la gente ha utilizado '-' para distinguir opciones de argumentos, y ha utilizado '-' en un nombre de archivo para significar stdin o stdout, según corresponda. ¡No subestimes el poder de las convenciones!

William Pursell
fuente
No sobrestime la capacidad de las personas para discernir los modos de hablar de las expresiones literales. Esto no ha estado sucediendo durante milenios.
tripleee
1
@tripleee: es cierto, pero ha estado sucediendo durante miles de millones de segundos. ;-)
David R Tribble
5

Significa utilizar el flujo de entrada estándar del programa.

En el caso de cd, significa algo diferente: cambiar al directorio de trabajo anterior.

Brian Cain
fuente