cd ~ <utente> è possibile ma perché non possiamo cd ~ “$ USER” o cd ~ $ {USER}


8

Sono curioso di sapere perché non possiamo passare al home director di un utente con nessuno dei due

$ cd ~"$USER"

o

$ cd ~${USER}

4
Perché è molto più semplice digitare "cd"?
jamesqf,

7
@jamesqf, sappiamo tutti cosa si può fare .. la domanda qui è su cosa non si può fare e perché?
Neo_Ritorna

Risposte:


20

Dipende molto dalla shell e dall'ordine in cui vengono fatte le espansioni in quelle shell.

~$usersi espande nella home directory dell'utente il cui nome è memorizzato in $usercsh (da dove ~userproviene quella funzione), AT&T ksh, zsh, fish.

Nota comunque queste variazioni:

$ u=daemon/xxx csh -c 'echo ~$u'
/usr/sbin/xxx  # same in zsh/fish
$ u=daemon/xxx ksh93 -c 'echo ~$u'
~daemon/xxx

$ u=daemon/xxx csh -c 'echo ~"$u"'
Unknown user: daemon/xxx.
$ u=daemon/xxx zsh -c 'echo ~"$u"'
/usr/sbin/x  # same in fish

$ u=" daemon" csh -c 'echo ~$u'
/home/stephane daemon
$ u=" daemon" zsh -c 'echo ~$u'
~ daemon  # same in ksh/fish

$ u="/daemon"  csh -c 'echo ~$u'
/home/stephane/daemon  # same in zsh
$ u="/daemon"  fish -c 'echo ~$u'
~/daemon  # same in ksh

Si espande nella home directory dell'utente chiamato letteralmente $userin bash(a condizione che l'utente esista, il che è molto improbabile ovviamente).

E a nessuno in pdksh, dash, yash, presumibilmente perché non considerano $useressere un nome utente valido.


Potete per favore suggerirmi dove posso saperne di più sull'espansione in varie shell.
Neo_Ritorna

6
@Neo_Returns, i loro rispettivi manuali e quando ciò non è chiaramente documentato, con tentativi ed errori e il codice sorgente per quelli in cui è disponibile ...
Stéphane Chazelas,

10

L'espansione di Tilde è un passaggio separato nell'elaborazione della riga di comando. Succede poco prima dell'espansione variabile.

Se la tilde è seguita da qualcosa di diverso da una barra, si espanderà nella home directory dell'utente il cui nome segue la tilde, come ad esempio in ~otheruser. Poiché $USERa quel punto non viene espanso e poiché è improbabile che corrisponda a un nome utente valido, la tilde non viene espansa.

$USERè probabile che sia il nome utente dell'utente corrente, quindi la tua espressione potrebbe essere sostituita da semplicemente ~.


6

Come hanno indicato altre risposte, il comportamento dipende da quale ordine fa la shell ~e dalle $espansioni e se farà entrambe le cose per la stessa parola.

Il comportamento che stavi cercando è possibile ottenere bashcon una piccola modifica al tuo comando. Prefisso semplicemente il comando con eval.

eval "cd ~$USER"

passerà alla home directory dell'utente fornita dal nome utente nella variabile USER, a condizione $USERche non contenga caratteri speciali per la shell (se c'è una remota possibilità che ciò accada, non si deve passare come argomento a evalciò che sarebbe pericoloso ) o /caratteri e che è presente una voce per quell'utente nel database utenti del sistema.


3

Un metodo alternativo per cercare la home directory di un utente variabile, se si utilizza una delle shell in cui si verifica l'espansione tilde prima dell'espansione variabile, è con getent . Questo strumento esiste almeno su Linux, Solaris e FreeBSD; Non sono sicuro di quanto sia universale.

$ USER=bloggs
$ getent passwd "$USER" | cut -d: -f6
/home/b/bloggs

Come con l'espansione tilde, questo potrebbe non darti la stessa cosa che su - $USER -c 'echo $HOME'verrebbe stampata se avessi i privilegi per farlo.


1
Vedi anche perl -le 'print((getpwnam shift)[7])' -- "$USER"come potenzialmente leggermente più portatile.
Stéphane Chazelas,

-2

Poiché il PO insiste su una risposta, eccolo qui.

Il comportamento di questi comandi (e molte altre cose) dipende dalla particolare shell che stai usando. A meno che non specifichi quale particolare shell usi, probabilmente non è possibile dare una risposta semplice.

È un dato di fatto, se usi tcsh, come faccio io, entrambe le espressioni nella domanda del PO (come è scritto mentre scrivo questo - non mi assumo alcuna responsabilità per le modifiche future!) Funzioneranno perfettamente. Non so cosa faranno le altre shell, dal momento che non le uso. Quindi forse l'OP non sa molto su cosa si può fare come pensa :-)

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.