Eu tenho essas variáveis no meu script:
TARGET=username
TARGET_DIR="~${TARGET}/.ssh"
Quero que TARGET_DIR
var mantenha esse caminho: /home/username/.ssh
mas use ~
em vez de /home/
. Mas quando executo o script e tento criar um novo .ssh
diretó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 ash
til ocorre antes da expansão dos parâmetros, então isso não pode funcionar.mksh
yash
Você pode usar ksh93
ou zsh
aqui 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 getent
comando (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, ~$user
mas não ksh93
, ~"$user"
também teria problemas).