Como salvar um caminho com ~ em uma variável?

Como salvar um caminho com ~ em uma variável?

Eu tenho essas variáveis ​​no meu script:

TARGET=username
TARGET_DIR="~${TARGET}/.ssh"

Quero que TARGET_DIRvar mantenha esse caminho: /home/username/.sshmas use ~em vez de /home/. Mas quando executo o script e tento criar um novo .sshdiretório com o nome de usuário, ele me diz:

mkdir: cannot create directory ‘~username/.ssh’: No such file or directory

Mesmo que os diretórios /home/username existam. Se eu fizer isso: TARGET_DIR="/home/${TARGET}/.ssh" funciona. Como posso usar o ~sinal na variável?

Responder1

A expansão em bash, e ashtil ocorre antes da expansão dos parâmetros, então isso não pode funcionar.mkshyash

Você pode usar ksh93ou zshaqui ou recorrer a eval:

user=username # making sure it's a valid username
eval "user_home=~$user"
target_dir=$user_home/.ssh

Se o seu sistema possui um getentcomando (bastante comum hoje em dia), você também pode usar:

user_home=$(getent -- passwd "$user" | cut -d: -f6)

Ou use perl:

user_home=$(perl -le 'for (@ARGV) {
  @u = getpwnam$_ or die "No such user: $_\n";
  print $u[7]}' -- "$user")

O que também funcionaria com usuários com caracteres incomuns em seus nomes de usuário (como espaço com o qual zsh, ~$usermas não ksh93, ~"$user"também teria problemas).

informação relacionada