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