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?
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?
Risposte:
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 $HOME
var o fare due cd
secondi. 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.
~
è fare cd ~user/download
per andare alla directory di download di un utente.
cd
Fondamentalmente fare è chiamare cd
senza argomenti e in accordo con il cd
comportamento "... 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 cd
comandare, 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, HOME
verrà 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 cd
farà una sola cosa, tilde può essere utilizzata per eseguire altre espansioni come ~+
per l'attuale directory di lavoro.
Tuttavia, abbastanza interessante possiamo unset HOME
rompere cd
ma ~
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 HOME
stringhe vuote rompe sia la tilde che il cd
comportamento.
Tilde e $HOME
hanno 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 HOME
il terminale ADM-3A di Lear-Siegler. HOME
al contrario è una variabile d'ambiente che aveva un significato puramente simbolico e nessuna rappresentazione fisica.
Inoltre, il fatto che si HOME
tratti 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 echo
generata 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 HOME
influisce 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 PWD
e HOME
rimane 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
, dash
e csh
- si comportano tutti allo stesso modo con cd
o 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.
Indipendentemente se sei diversi livelli di cartelle sopra o sotto $HOME
, i comandi cd
e 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 $HOME
quando si digita un cd
comando. 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
~ 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.
root
La home directory di Eg è di solito fuori/home
cd ~
vscd $HOME
vscd ~not-tandu
. Questa domanda sta chiedendo circacd
vscd ~
.