cd ~ user é possível, mas por que não podemos cd ~ “$ USER” ou cd ~ $ {USER}

8

Estou curioso porque não podemos mudar para o diretor da casa do usuário com

$ cd ~"$USER"

ou

$ cd ~${USER}
    
por Neo_Returns 17.05.2018 / 16:14

5 respostas

20

Isso depende muito do shell e da ordem em que as expansões são feitas nessas camadas.

~$user expande para o diretório inicial do usuário cujo nome está armazenado em $user in csh (de onde vem esse recurso ~user ), AT & T ksh, zsh, fish.

Note, no entanto, estas variações:

$ 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

Ele se expande para o diretório inicial do usuário chamado literalmente $user in bash (desde que o usuário exista, o que é muito improvável, é claro).

E nem em pdksh , dash , yash , presumivelmente porque eles não consideram $user um nome de usuário válido.

    
por 17.05.2018 / 16:24
10

A expansão til é uma etapa separada no processamento da linha de comando. Isso acontece apenas em antes expansão da variável.

Se o til for seguido por algo diferente de uma barra, ele será expandido para o diretório inicial do usuário cujo nome está seguindo o til, como, por exemplo, ~otheruser . Como $USER não é expandido nesse ponto e como é improvável que corresponda a um nome de usuário válido, o til não é expandido.

É provável que

$USER seja o nome de usuário do usuário atual, portanto, sua expressão provavelmente poderia ser substituída por apenas ~ .

    
por 17.05.2018 / 16:21
6

Como outras respostas apontaram, o comportamento depende da ordem em que o shell faz as expansões ~ e $ e se ele fará as duas coisas pela mesma palavra.

O comportamento que você estava procurando é possível alcançar em bash por uma pequena alteração em seu comando. Basta prefixar o comando com eval .

eval "cd ~$USER"

mudará para o diretório pessoal do usuário dado pelo nome de usuário na variável USER , desde que $USER não contenha caracteres especiais para o shell (se houver uma chance remota de que isso aconteça, você não deve passar como argumento para eval , pois isso seria perigoso) ou / caracteres e que existe uma entrada para esse usuário no banco de dados do usuário do sistema.

    
por 18.05.2018 / 00:23
3

Uma maneira alternativa de procurar um diretório pessoal do usuário variável, se você estiver usando uma das shells nas quais a expansão do til acontece antes da expansão da variável, é com getent . Esta ferramenta existe pelo menos em Linux, Solaris e FreeBSD; Não tenho certeza de como isso é universal.

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

Assim como na expansão do til, isso pode não dar a mesma coisa que su - $USER -c 'echo $HOME' imprimiria se você tivesse os privilégios para fazer isso.

    
por 17.05.2018 / 18:09
-1

Como o OP insiste em uma resposta, aqui está.

O comportamento desses comandos (e muitas outras coisas) depende do shell em particular que você está usando. A menos que você especifique qual shell em particular você usa, provavelmente não é possível dar uma resposta simples.

Na verdade, se você usar o tcsh, como eu faço, ambas as expressões na pergunta do OP (como está escrito quando escrevo isto - não me responsabilizo por edições futuras!) funcionam perfeitamente bem. Eu não sei o que outras conchas farão, já que eu não as uso. Então talvez o OP não saiba tanto sobre o que pode ser feito como ele pensa: -)

    
por 19.05.2018 / 03:50