Differenza tra 'cd' e 'cd ~'


10

Mi chiedo, se il cd da solo mi manda nella mia cartella home e cd ~ fa lo stesso, perché allora il ~ è stato aggiunto in primo luogo?

È qualcosa di specifico per BASH o si comporterebbero diversamente in un'altra Shell?


2
Sicuramente non è un duplicato. Tale questione sta chiedendo circa cd ~vs cd $HOMEvs cd ~not-tandu. Questa domanda sta chiedendo circa cdvs cd ~.

Risposte:


17

La ~può essere utilizzato per più di questo. Qualsiasi comando può trarre vantaggio dall'avere un collegamento alla cartella principale. Quindi non è necessario se si desidera effettuare il cd in casa, ma che dire ~/.config?

$ cd ~/.config

Altrimenti dovresti scrivere il percorso principale, usare $HOMEvar o fare due cdsecondi. Anche per copiare o spostare file:

$ cp ~/downloads/some-file some/path/

Poiché la maggior parte dei tuoi file è in casa, è sempre bene avere un collegamento.


Ciao ahilsend, in realtà la mia domanda è più orientata verso il perché dei 2 modi. Conosco già ~ usando la variabile $ HOME ma, con questa idea, perché anche "CD" da solo mi manda a casa. Perché 2 modi per lo stesso scopo?
Luis Alvarado,

4
@CYREX La mia ipotesi sarebbe quella di salvare la digitazione per il caso molto comune di voler passare alla home directory.
un CVn il

1
L'altro uso di ~è fare cd ~user/downloadper andare alla directory di download di un utente.
ott--

5

cd Fondamentalmente fare è chiamare cdsenza argomenti e in accordo con il cdcomportamento "... se non viene fornito dir, il valore della variabile della shell HOME è il valore predefinito." (dal manuale di bash ). Al contrario, cd ~è quando si fornisce l'argomento da cdcomandare, che succede ~e la shell eseguirà l' espansione della tilde . Per quanto riguarda il ritorno alla home directory dell'utente, non c'è differenza. In entrambi i casi, HOMEverrà interrogata la variabile di ambiente:

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

In effetti, anche questo non fa differenza cd $HOME. Tuttavia, mentre cdfarà una sola cosa, tilde può essere utilizzata per eseguire altre espansioni come ~+per l'attuale directory di lavoro.

Tuttavia, abbastanza interessante possiamo unset HOMErompere cdma ~funzionerà ancora:

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

Perché ? Ancora una volta, rispondi nel manuale:

Se HOME non è impostato, viene invece sostituita la home directory dell'utente che esegue la shell. Altrimenti, il prefisso tilde viene sostituito con la home directory associata al nome di accesso specificato.

Si noti che il disinserimento è diverso dal rendere variabile vuota HOME=e ha effetto. La documentazione parla in particolare di variabili non inquinanti. Rendere variabile uguale a stringa vuota ha effetto opposto a quello che ci aspetteremmo:

bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr

Qui puoi vedere che creare HOMEstringhe vuote rompe sia la tilde che il cdcomportamento.


Tilde e $HOMEhanno in qualche modo una differenza e una diversa ragione di esistenza. $HOMEè una variabile di shell, che per coincidenza è anche una delle variabili di ambiente - ed è disponibile per tutti i programmi; in C useresti environ()per accedervi. Al contrario, tildeè una sintassi specifica della shell che esegue l'espansione della tilde, sebbene sia possibile utilizzare la wordexp()funzione per eseguire l'espansione simile alla shell ( riferimento ) anche in C.

Il motivo per cui ~rappresenta HOMEè stata data risposta a questa domanda : un tempo il personaggio tilde condivideva la stessa chiave con HOMEil terminale ADM-3A di Lear-Siegler. HOMEal contrario è una variabile d'ambiente che aveva un significato puramente simbolico e nessuna rappresentazione fisica.

Inoltre, il fatto che si HOMEtratti di una variabile di ambiente ci consente di disinserirla, laddove non possiamo impostare ~qualcos'altro con mezzi semplici.

# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'                           

/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'                                

/home/xieerqi

Notare la riga vuota in cui per prima viene echogenerata la variabile non impostata e il fatto che. Al contrario, non possiamo fare cose del genere per tilde:

$ bash -c '~=; cd ~;pwd'                                                    
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'                                               
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'                                               
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi

Tuttavia, l'alterazione HOMEinfluisce su ~:

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

Inoltre, poiché ~funziona anche come carattere di espansione, possiamo fare cose come questa per mostrare l'attuale directory di lavoro:

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

Considerando che se vogliamo farlo tramite le variabili di ambiente, abbiamo bisogno PWDe HOMErimane lo stesso, o se fai cose del genere echo $HOME+- è semplicemente concatenazione di stringhe / variabili. Ma ancora una volta, ~+prende le informazioni dalle variabili di ambiente:

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

NOTA : le espansioni ~+e ~-funzionano in ksh, ma non in dash.


Per rispondere ad alcune delle tue domande specifiche:

È qualcosa di specifico per BASH o si comporterebbero diversamente in un'altra Shell?

No, questo dovrebbe essere un comportamento coerente. ksh, dashe csh- si comportano tutti allo stesso modo con cdo cd ~.

perché è stato ~ aggiunto in primo luogo allora?

Direi convenienza e ragioni storiche come spiegato nella risposta collegata su tilde. Alla fine, è cresciuto per eseguire più di una semplice espansione della home directory.


0

Indipendentemente se sei diversi livelli di cartelle sopra o sotto $HOME, i comandi cde cd ~fare la stessa cosa e non differiscono - invierà di nuovo al vostro home directory.

TUTTAVIA: Quando sei 1 o più livelli di cartella sopra HOME e vuoi andare DIRETTAMENTE a una sottodirectory 1 o più livelli di cartella sotto $HOME, la tilde ( ~) è utile salvandoti i tasti quando viene usata per sostituire il testo necessario per fare riferimento a $HOMEquando si digita un cdcomando. Per esempio;

/$ cd    # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3    # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3

0

~ sta per / home / nome utente, quindi risparmi un po 'di tempo durante la digitazione. Ad esempio cd / home / nome utente / Download è uguale a cd ~ / Download, ma meno battitura. Entrambi i comandi fanno lo stesso, cambiano la directory di lavoro in quella posizione.


Non proprio. rootLa home directory di Eg è di solito fuori/home
Dmitry Grigoryev il
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.