Ich habe diese Variablen in meinem Skript:
TARGET=username
TARGET_DIR="~${TARGET}/.ssh"
Ich möchte, dass die TARGET_DIR
Variable diesen Pfad enthält: /home/username/.ssh
aber ~
anstelle von verwendet wird /home/
. Aber wenn ich das Skript ausführe und versuche, ein neues Verzeichnis unter dem Benutzernamen zu erstellen, .ssh
wird mir Folgendes angezeigt:
mkdir: cannot create directory ‘~username/.ssh’: No such file or directory
Auch wenn das Verzeichnis /home/username existiert. Wenn das der Fall ist, funktioniert es. Wie kann ich das Zeichen in der Variable TARGET_DIR="/home/${TARGET}/.ssh"
verwenden ?~
Antwort1
In bash
, ash
, mksh
und yash
erfolgt die Tilde-Erweiterung vor der Parametererweiterung, daher kann das nicht funktionieren.
Sie können hier stattdessen ksh93
oder verwenden zsh
oder auf Folgendes zurückgreifen eval
:
user=username # making sure it's a valid username
eval "user_home=~$user"
target_dir=$user_home/.ssh
Wenn Ihr System über einen getent
Befehl verfügt (heutzutage recht üblich), können Sie auch Folgendes verwenden:
user_home=$(getent -- passwd "$user" | cut -d: -f6)
Oder verwenden Sie perl
:
user_home=$(perl -le 'for (@ARGV) {
@u = getpwnam$_ or die "No such user: $_\n";
print $u[7]}' -- "$user")
Das würde auch bei Benutzern funktionieren, deren Benutzernamen ungewöhnliche Zeichen enthalten (wie etwa Leerzeichen, die bei zsh ebenfalls ein Problem darstellen würden, ~$user
nicht jedoch bei ksh93
's ).~"$user"