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

1

Eu tenho essas variáveis no meu script:

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

Eu quero que o TARGET_DIR var segure esse caminho: /home/username/.ssh , mas use ~ em vez de /home/ . Mas quando eu executo o script e tento criar o novo .ssh dir sob o nome de usuário, ele me diz:

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

Embora o diretório / home / username exista. Se eu fizer isso: TARGET_DIR="/home/${TARGET}/.ssh" funciona. Como posso usar o sinal ~ na variável?

    
por lakerda 22.11.2017 / 17:14

1 resposta

3

Em bash , ash , mksh e yash tilde, a expansão ocorre antes da expansão do parâmetro, portanto isso não funciona.

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 comando getent (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 seu nome de usuário (como o espaço em que zshs ~$user , mas não ksh93 ' ~"$user" também teriam um problema).

    
por 22.11.2017 / 17:39