~ è $ HOME, ma a volte?


14

cd ~

fa la stessa cosa di

cd $HOME

che è anche lo stesso di

cd /home/tandu

Tuttavia,

cd ~not-tandu

cambia in /home/not-tandu

È una scelta puramente sintattica? Come viene gestito dal kernel (o cddall'eseguibile?) Esiste un caso speciale per ~aggiungere la barra se tutto il resto viene omesso? Vale a dire, ~/e ~passare alla stessa directory, ma ~aè una directory su. Lo stesso non si può dire per qualsiasi altra directory in cui si cambia.


3
Sentiti libero di confrontare ~ not-tandu e ~ / not-tandu, uno indica l'utente non-tandu home dir e l'altro indica il dir-tandu nel tuo homedir.
Johan

4
Non è il kernel o il "cd eseguibile" (poiché non esiste nulla del genere) - è una shell integrata.
Paul Tomblin,

Dal momento che non lo dici: cdsenza parametri funziona come cd ~. Se lo sostituisci cdcon echopuoi vedere a che cosa l'espressione viene espansa dalla shell.
jofel

Risposte:


18

~è un alias $HOMEfornito da un numero di shell, ma $HOMEè più universale. $HOMEin realtà chiede alla shell di inserire (sostituire) la variabile ambientale HOME qui. Esistono diverse variabili ambientali che possono essere sostituite, prova a correre envper un elenco. Nota che ~non è sempre riconosciuto quando non è all'inizio di una parola. Prova questi due comandi per il confronto:

ls /~
ls /$HOME

Il primo viene passato all'eseguibile ls poiché in realtà è un comando incorporato. È una direttiva speciale che dice alla shell stessa di cambiare directory. Non è come gli altri built-in della shell che possono essere implementati come eseguibili separati come perché è usato per cambiare un attributo fondamentale del processo della shell. è semplicemente una shell integrata per motivi di prestazioni, ma ai vecchi tempi di UNIX era disponibile solo come eseguibile/~ che cerca quindi di esaminare un file chiamato ~nella directory principale, il secondo si espande $HOMEe diventa, //home/userquindi viene passato all'eseguibile ls come argomento della riga di comando. Tutti i sistemi POSIX (POSIX è lo standard per il funzionamento dei sistemi UNIX e Linux) consentono a più barre di essere trattate allo stesso modo di una barra, quindi //home/userè come dire /home/user. ~usernameè una scorciatoia per dire alla shell di cercare il nome utente nel file passwd e di restituire la loro home directory. Non esiste una variabile d'ambiente equivalente. Tutte queste sostituzioni sono fatte dalla shell e sono supportate dalla maggior parte di esse, ma solo le variabili d'ambiente come $HOMEsono garantite per essere supportate da tutte le shell. Anche,cdechoecho/bin/echo .


re "che quindi cerca di guardare un file chiamato ~ nella directory principale"; Questo è per tutti i gusti unix?
Pacerier,

17

~foo significa "la home directory dell'utente foo".

Questo non è fatto dal kernel, è interpretato dalla shell. Ogni volta che la shell vede ~foocome argomento, la sostituisce in modo trasparente con la home directory dell'utente fooe la passa al suo posto. Quindi quando corri cd ~tandu, la shell è effettivamente in esecuzione cd /home/tandu.


1
Che cosa significa specificamente questa sostituzione e con quale algoritmo? È cdo il guscio? Cosa succede se non si esegue una shell? È un semplice "se ~ è seguito da qualcosa, si espande in modo diverso?" o c'è qualche altra gestione speciale per questa condizione unica?
Explosion Pills

8
Consulta il manuale di Bash su Tilde Expansion . (Molte altre shell e programmi seguono regole simili.)
cjm

4
@tandu: lo fa la shell cd, non esiste un eseguibile esterno per farlo (non sarebbe possibile)
Mat

1
@tandu: se non si esegue una shell (ad es. provando a usarlo exec(2)), l'espansione della shell non ha luogo. Senza l'espansione della shell, ~non viene sostituito da nulla: è solo un altro personaggio perfettamente valido. Questo mi ha morso nei miei primi giorni di SunOS perché /bin/shnon brontolava ~.
Alessio

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.