Differenza tra "cd -" e "cd ~ -"


56

Il comando Bash

cd - 

stampa la directory utilizzata in precedenza e la modifica.

D'altra parte, il comando Bash

cd ~-

passa direttamente alla directory utilizzata in precedenza, senza fare eco.

Questa è l'unica differenza? Qual è il caso d'uso per ciascuno dei comandi?


3
Ti consiglio di non usare nessuna di queste cose difficili. Questo è il tuo cervello acceso cd ~-.
Depresso

10
@DepressedDaniel, anche se non hai intenzione di usare cose complicate, è comunque utile capire cosa sta succedendo dietro le quinte: capire casi angolari può farti uscire da un buco in seguito quando provi a eseguire il debug di qualcosa di diverso.
AnotherDave

Risposte:


81

Ci sono due cose in gioco qui. Innanzitutto, il -solo viene espanso nella directory precedente. Questo è spiegato nella cdsezione di man bash(il mio accento):

Un argomento di -viene convertito in $ OLDPWD prima di tentare la modifica della directory. Se viene utilizzato un nome di directory non vuoto da CDPATH o se -è il primo argomento e la modifica della directory ha esito positivo, il percorso assoluto della nuova directory di lavoro viene scritto nell'output standard. Il valore restituito è true se la directory è stata modificata correttamente; falso altrimenti.

Quindi, un semplice cd -ti riporterà alla directory precedente e stamperà il nome della directory. L'altro comando è documentato nella sezione "Tilde Expansion":

Se il prefisso tilde è a ~+, il valore della variabile shell PWD sostituisce il prefisso tilde. Se il prefisso tilde è a ~-, il valore della variabile di shell OLDPWD, se impostato, viene sostituito. Se i caratteri che seguono la tilde nel prefisso tilde sono costituiti da un numero N, eventualmente prefissato da a +o a -, il prefisso tilde viene sostituito con l'elemento corrispondente dallo stack della directory, poiché verrebbe visualizzato dalle directory incorporate invocate con il prefisso tilde come argomento. Se i caratteri che seguono la tilde nel prefisso tilde sono costituiti da un numero senza virgola +o o -, +si presume.

Questo potrebbe essere più facile da capire con un esempio:

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

Quindi, in generale, -significa "la directory precedente". Ecco perché cd -da solo ti riporterà ovunque tu fossi.

La differenza principale è che cd -è specifica per il cdbuiltin. Se ci provi echo -stamperà solo a -. La ~-fa parte della funzionalità di espansione tilde e si comporta in modo simile a una variabile. Ecco perché puoi echo ~-e ottenere qualcosa di significativo. Puoi anche usarlo in cd ~-ma potresti anche usarlo in qualsiasi altro comando. Ad esempio, cp ~-/* .che sarebbe equivalente acp "$OLDPWD"/* .


1
set -xper stampare il comando espanso prima di eseguirlo potrebbe essere utile illustrare la differenza (o potrebbe essere illeggibilmente il rumore quando non lo fai da solo un passo alla volta).
Peter Cordes,

1
@terdon oggi ho imparato.
sitilge,

In breve ... cd ~-/..funziona, cd -/..no!
Ray Foss

13

~-è soggetto all'espansione della tilde (vedi man bash), quindi ciò che cdvede è direttamente il nome della directory precedente. -non viene espanso dalla shell, lo cdvede direttamente e si comporta come documentato:

Un argomento di - equivale a $ OLDPWD. Se viene utilizzato un nome di directory non vuoto da CDPATH o se - è il primo argomento e la modifica della directory ha esito positivo, il percorso assoluto della nuova directory di lavoro viene scritto nell'output standard.


4

TL; DR: cd -è integrato cd, ~-è un'estensione successiva di ~[name], non specifica cd.

POSIX.1-2008 Shell & Utilities definisce cd -un caso speciale specifico per il cdcomando :

Quando a -viene usato come operando, questo deve essere equivalente al comando:

cd "$OLDPWD" && pwd

che passa alla directory di lavoro precedente e quindi scrive il suo nome.

L' ~-estensione verrà espansa $OLDPWDprima dell'esecuzione di qualsiasi comando e può essere passata come argomento per qualsiasi comando, non solo cd. È un'estensione successiva in e .

Il suddetto standard Shell & Utilità POSIX.1-2008 ha anche una spiegazione elaborata di Tilde Expansion . La formulazione è molto specifica per consentire un ~-comportamento indefinito nell'ambito dello standard, dove si ~[name]riferisce a $HOMEse [name]è la stringa vuota o alla home directory dell'utente namese nameè un nome utente valido.

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.