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.