Wie speichere ich einen Pfad mit ~ in einer Variablen?

Wie speichere ich einen Pfad mit ~ in einer Variablen?

Ich habe diese Variablen in meinem Skript:

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

Ich möchte, dass die TARGET_DIRVariable diesen Pfad enthält: /home/username/.sshaber ~anstelle von verwendet wird /home/. Aber wenn ich das Skript ausführe und versuche, ein neues Verzeichnis unter dem Benutzernamen zu erstellen, .sshwird 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, mkshund yasherfolgt die Tilde-Erweiterung vor der Parametererweiterung, daher kann das nicht funktionieren.

Sie können hier stattdessen ksh93oder verwenden zshoder 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 getentBefehl 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, ~$usernicht jedoch bei ksh93's ).~"$user"

verwandte Informationen