¿Se usa `-` solo con cd?


45

cd - puede cambiar entre el directorio actual y el directorio anterior.

Parece que lo he visto -usado como argumentos para otros comandos antes, aunque no recuerdo si -significa lo mismo que con cd.

Descubrí que eso -no funciona ls.

¿Se - usa solo con cd?


8
Algo a tener en cuenta es que cdes un comando incorporado, no un comando externo (ni tendría ninguna forma de funcionar como tal). cd -es, por lo tanto, una característica de nivel de shell.
esponjoso

66
Uso todo el tiempo git checkout -para cambiar a la rama anterior
wim

@fluffy: ¿Se -usan con otras construcciones de la misma manera?
Tim

Para algunos de los integradores de manejo de directorios como pushd, sí. De lo contrario, el significado de "el directorio anterior" no es un valor predeterminado terriblemente útil.
esponjoso

1
Quizás esté pensando en la característica '~ -' de bash (que se interpreta como $ OLDPWD). Eso se puede usar con 'ls' de la manera que describas.
abonet

Respuestas:


22

Las pautas de sintaxis de la utilidad POSIX (específicamente # 13) especifican que para las utilidades que esperan leer un nombre de archivo, -significa entrada estándar, y para las utilidades que esperan que se escriba un nombre de archivo, -significa salida estándar. Por ejemplo, cat somefile -copia el contenido de somefilea su salida estándar, seguido de lo que lee en su entrada estándar.

Esta directriz no se aplica al cdcomando ya que no lee ni escribe en un archivo. cdhace algo diferente: el argumento -significa "el directorio anterior". El comando cd -es equivalente a cd "$OLDPWD" && pwd. Este comportamiento es específico del cdcomando y de comandos inspirados directamente como pushd.

Tenga en cuenta que -es un operando, no una opción. Solo los argumentos que comienzan con -y no son justos -o --son opciones. La principal implicación de ser un operando es que --no afecta su significado especial. Por ejemplo, cd -- -Pcambia a un subdirectorio llamado -P, pero cd -- -es lo mismo que cd -, no cambia a un directorio llamado -. Del mismo modo, cat -- -no lee de un archivo llamado -sino de una entrada estándar.


46

-se define en las Directrices de sintaxis de la utilidad POSIX como entrada estándar:

Guideline 13:
For utilities that use operands to represent files to be opened for either 
reading or writing, the '-' operand should be used to mean only standard input 
(or standard output when it is clear from context that an output file is being 
specified) or a file named -.

Puede ver esta definición para las utilidades que operan con archivos para leer o escribir. cdno pertenece a estas utilidades, por lo que -en cd no sigue esta directriz.

Además, POSIX también -tiene un significado propio con cd :

-
    When a <hyphen> is used as the operand, this shall be equivalent to the 
    command:

    cd "$OLDPWD" && pwd

    which changes to the previous working directory and then writes its name.

36

cd -en realidad es la abreviatura de cd "$OLDPWD" && pwd, donde $OLDPWDse establece cada vez que cambia los directorios al directorio en el que estaba.

El manejo de -depende de la aplicación. Algunas aplicaciones usan -para significar STDIN, por ejemplo grep,awk

Otras aplicaciones pueden usar -como abreviatura para cualquier cosa que elijan, como especifica la respuesta de Michael, con su, -es abreviatura para--login


sí, de hecho no hay una regla para eso.
Kiwy

2
@ Kiwy: con POSIX, hay una regla para eso, vea mi respuesta.
Cuonglm

Para ser precisos, hay una regla general, pero tiene muchas excepciones. También hay muchos comandos que son anteriores a la regla o implementaciones antiguas que no se han actualizado para cumplir con la regla.
Barmar

19

Aunque Michael menciona que suy otras aplicaciones pueden usarse -para significar lo que quieran (leer de stdin es común), Git sí lo hace -de una manera similar a como lo cdhace , para cambiar ramas.

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master

18

Cualquier programa puede usarse -como argumento, para significar lo que quieran. Un ejemplo común es su, que utiliza -como abreviatura de --login. La única convención en la que puedo pensar es que los programas que leen de archivos con frecuencia -significan "leer de stdin" , pero depende completamente del programa


¿Existen convenciones estándar o no estándar para usar símbolos especiales como argumentos?
Tim

2

Agregando mis dos centavos aquí. Utilizo '-' para decirle a la herramienta ps2pdf que lea de la entrada estándar, como varias personas han sugerido anteriormente:

man -t ls | ps2pdf - ls.pdf

El one-liner anterior crea una versión en pdf de la página man para ls en el directorio actual.
Espero que alguien lo encuentre útil :).


2

Como respondió gnouc , -tiene su propio significado en cd.

Sin embargo, puede replicar el comportamiento de -otros programas mediante ~-. Por ejemplo:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.