Wie speichere ich einen Pfad mit ~ in einer Variablen?

1

Ich habe diese Variablen in meinem Skript:

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

Ich möchte, dass der TARGET_DIRvar diesen Pfad beibehält: /home/username/.sshaber ~anstelle von verwendet /home/. Aber wenn ich das Skript starte und versuche, ein neues .sshVerzeichnis unter dem Benutzernamen zu erstellen, heißt es:

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

Obwohl das Verzeichnis / home / username existiert. Wenn ich es tue: TARGET_DIR="/home/${TARGET}/.ssh" es funktioniert. Wie kann ich das ~Vorzeichen in der Variablen verwenden?

Lakerda
quelle
~ verweist auf das Home-Verzeichnis des Benutzers, dh / home / username. Sie müssten daher ~ nicht erweitern, sondern TARGET_DIR stattdessen home hinzufügen, also TARGET_DIR = "/ home / $ TARGET / .ssh"
Raman Sailopal

Antworten:

3

In bash, ash, mkshund yashtritt Tilde - Erweiterung vor Parameter Expansion, so arbeiten , dass nicht.

Sie können ksh93oder zshstattdessen hier verwenden 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 einen getentBefehl hat (heutzutage sehr verbreitet), können Sie auch Folgendes verwenden:

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

Oder verwenden perl:

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

Das würde auch mit Benutzern funktionieren, deren Benutzername ungewöhnliche Zeichen enthält (wie zshs, ~$useraber nicht ksh93zshs, ~"$user"die ebenfalls ein Problem haben würden).

Stéphane Chazelas
quelle
danke, aber hast du nicht anders gemeint? Diese Parametererweiterung erfolgt vor der Erweiterung ~? Ansonsten macht es für mich keinen Sinn. Ich würde gerne wissen, ob Sie das für mich klären können.
Lakerda
@lakerda, nein. Wenn zuvor eine Param-Erweiterung stattgefunden hätte, ~$userwürde diese nach ~usernameund dann nach erweitert werden /home/userhome. Aber es ist umgekehrt. Wenn Sie einen Benutzer , dessen Benutzernamen hatte , war $user, ~$userauf das Home - Verzeichnis des Benutzers erweitern würden (in bash, nicht in ash/ mksh/ yashwo das ~$userist einfach nicht als Tilde - Erweiterung erkannt überhaupt , da sie betrachten $ist kein gültiges Zeichen in einem Benutzernamen. Wie derzeit geschrieben, würde die POSIX-Spezifikation implizieren, dass nur bashin dieser Hinsicht konform ist (in anderen Fällen ist die POSIX-Spezifikation jedoch nicht klar).
Stéphane Chazelas