¿Cómo guardar una ruta con ~ en una variable?

¿Cómo guardar una ruta con ~ en una variable?

Tengo estas variables en mi script:

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

Quiero que la TARGET_DIRvar contenga esta ruta: /home/username/.sshpero para usarla ~en lugar de /home/. Pero cuando ejecuto el script e intento crear un nuevo .sshdirectorio con el nombre de usuario, me dice:

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

Aunque los directorios /home/username existen. Si lo hago: TARGET_DIR="/home/${TARGET}/.ssh" funciona. ¿Cómo puedo utilizar el ~signo en la variable?

Respuesta1

En bash, ashy la expansión mkshde yashtilde ocurre antes de la expansión de parámetros, por lo que no puede funcionar.

Puedes usar ksh93o zshen su lugar aquí, o recurrir a eval:

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

Si tu sistema tiene un getentcomando (bastante común hoy en día), también puedes usar:

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

O usar perl:

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

Lo que también funcionaría con usuarios con caracteres poco comunes en su nombre de usuario (como espacios con los que zsh ~$userpero no ksh93's ~"$user"también tendrían problemas).

información relacionada