Tengo estas variables en mi script:
TARGET=username
TARGET_DIR="~${TARGET}/.ssh"
Quiero que la TARGET_DIR
var contenga esta ruta: /home/username/.ssh
pero para usarla ~
en lugar de /home/
. Pero cuando ejecuto el script e intento crear un nuevo .ssh
directorio 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
, ash
y la expansión mksh
de yash
tilde ocurre antes de la expansión de parámetros, por lo que no puede funcionar.
Puedes usar ksh93
o zsh
en 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 getent
comando (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 ~$user
pero no ksh93
's ~"$user"
también tendrían problemas).