Estou curioso para saber por que não podemos mudar para o diretor inicial de um usuário com
$ cd ~"$USER"
ou
$ cd ~${USER}
Estou curioso para saber por que não podemos mudar para o diretor inicial de um usuário com
$ cd ~"$USER"
ou
$ cd ~${USER}
Isso depende muito do shell e da ordem em que as expansões são feitas nesses shells.
~$user
expande-se para o diretório inicial do usuário cujo nome está armazenado em$user
csh (de onde~user
vem esse recurso), AT&T ksh, zsh, fish.Observe, no entanto, essas variações:
Ele se expande para o diretório inicial do usuário nomeado literalmente
$user
embash
(desde que o usuário exista, o que é muito improvável, é claro).E para nenhum em
pdksh
,dash
,yash
, presumivelmente porque eles não consideram$user
um nome de usuário válido.A expansão do til é uma etapa separada no processamento da linha de comando. Acontece pouco antes da expansão 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 em, por exemplo,
~otheruser
. Como$USER
não é expandido nesse ponto e é improvável que corresponda a um nome de usuário válido, o til não é expandido.$USER
provavelmente será o nome de usuário do usuário atual, então sua expressão provavelmente poderia ser substituída por apenas~
.Como outras respostas apontaram, o comportamento depende de qual ordem o shell faz
~
e$
expansões e se ele fará as duas coisas para a mesma palavra.O comportamento que você estava procurando é possível alcançar
bash
com uma pequena mudança em seu comando. Basta prefixar o comando comeval
.irámudar para o diretório home do usuário fornecido pelo nome de usuário na variável
USER
, desde$USER
que não contenha caracteres especiais para o shell (se houver uma chance remota de que isso aconteça, você não deve passá-lo como argumento paraeval
pois isso seria perigoso ) ou/
caracteres e se há uma entrada para esse usuário no banco de dados de usuários do sistema.Uma maneira alternativa de pesquisar o diretório inicial de um usuário variável, se você estiver usando um dos shells em que a expansão do til ocorre antes da expansão da variável, é com getent . Esta ferramenta existe pelo menos no Linux, Solaris e FreeBSD; Não tenho certeza de quão universal é.
Tal como acontece com a expansão til, isso pode não fornecer a mesma coisa que
su - $USER -c 'echo $HOME'
seria impressa se você tivesse os privilégios para fazer isso.Já que o OP insiste em uma resposta, aqui está.
O comportamento desses comandos (e muitas outras coisas) depende do shell específico 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 tcsh, como eu, ambas as expressões na pergunta do OP (como está escrito enquanto escrevo isso - não me responsabilizo por edições futuras!) Funcionam perfeitamente bem. Não sei o que outras conchas farão, já que não as uso. Então, talvez o OP não saiba tanto sobre o que pode ser feito quanto pensa :-)