`-` è usato solo con cd?


45

cd - può passare dalla directory corrente a quella precedente.

Sembra che ho visto -usato come argomenti per altri comandi prima, anche se non ricordo se -significhi lo stesso di cd.

Ho scoperto che -non funziona con ls.

Viene - utilizzato solo con cd?


8
Qualcosa da tenere a mente è che cdè un comando incorporato, non un comando esterno (né avrebbe alcun modo di funzionare come tale). cd -è quindi una funzionalità a livello di shell.
soffice

6
Uso tutto il tempo git checkout -per passare al ramo precedente
wim

@fluffy: vengono -utilizzati con altri builtin allo stesso modo?
Tim

Per alcuni dei builtin di gestione directory come pushd, sì. Altrimenti, il significato di "directory precedente" non è un valore di default terribilmente utile.
soffice

1
Forse stai pensando alla funzione '~ -' di bash (che è interpretata come $ OLDPWD). Questo può essere usato con 'ls' nel modo che descrivi.
abonet

Risposte:


22

Le linee guida per la sintassi dell'utilità POSIX (in particolare n. 13) specificano che per le utility che prevedono la lettura di un nome file, -significa input standard e per le utility che prevedono la scrittura di un nome file, -output standard. Ad esempio, cat somefile -copia il contenuto somefiledell'output standard, seguito da ciò che legge sul suo input standard.

Questa linea guida non si applica al cdcomando poiché non legge o scrive in un file. cdfa qualcosa di diverso: l'argomento -significa "la directory precedente". Il comando cd -è equivalente a cd "$OLDPWD" && pwd. Questo comportamento è specifico del cdcomando e di comandi ispirati direttamente come pushd.

Si noti che -è un operando, non un'opzione. Solo argomenti che iniziano con -e non sono solo -o --sono opzioni. La principale implicazione di essere un operando è che --non influisce sul suo significato speciale. Ad esempio, cd -- -Pcambia in una sottodirectory chiamata -P, ma cd -- -è uguale a cd -, non cambia in una directory chiamata -. Allo stesso modo, cat -- -non legge da un file chiamato -ma dall'input standard.


46

-è definito nelle Linee guida per la sintassi dell'utilità POSIX come input standard:

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 -.

È possibile visualizzare questa definizione per le utilità che funzionano con i file per la lettura o la scrittura. cdnon appartiene a queste utility, quindi -nel cd non segue questa linea guida.

Inoltre, POSIX anche definito -ha il suo significato 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 -è in realtà una scorciatoia per cd "$OLDPWD" && pwd, dove $OLDPWDviene impostato ogni volta che si cambiano le directory nella directory in cui ci si trovava.

La gestione di -dipende dall'applicazione. Alcune applicazioni usano -per indicare STDIN, ad esempio grep,awk

Altre applicazioni possono usare -come scorciatoia per tutto ciò che scelgono, come specifica la risposta di Michael, con su, -è una scorciatoia per--login


sì, in effetti non esiste una regola per questo.
Kiwy,

2
@Kiwy: Con POSIX esiste una regola per questo, vedi la mia risposta.
cuonglm,

Per essere precisi, c'è una regola generale, ma ha molte eccezioni. Ci sono anche molti comandi che precedono la regola o vecchie implementazioni che non sono state aggiornate per conformarsi alla regola.
Barmar,

19

Sebbene Michael menzioni che sue altre applicazioni possono usare -per significare quello che vogliono (leggere dallo stdin è comune), Git usa -in un modo simile a come cdfa , per cambiare i rami.

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master

18

Qualsiasi programma può usare -come argomento, per significare quello che vogliono. Un esempio comune è su, che utilizza -come scorciatoia per --login. L'unica convenzione a cui riesco a pensare è che i programmi che leggono dai file usano spesso -per significare "leggere dallo stdin" , ma dipende interamente dal programma


Esistono convenzioni standard o non standard per l'utilizzo di simboli speciali come argomenti?
Tim

2

Aggiungendo i miei due centesimi qui. Uso '-' per dire allo strumento ps2pdf di leggere dallo standard input, come diverse persone hanno suggerito in precedenza:

man -t ls | ps2pdf - ls.pdf

Il precedente one-liner crea una versione pdf della pagina man per ls nella directory corrente.
Spero che qualcuno lo trovi utile :).


2

Come ha risposto Gnouc , -ha il suo significato in cd.

Tuttavia, è possibile replicare il comportamento di -in altri programmi utilizzando ~-. Per esempio:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.