Ich habe diese Variablen in meinem Skript:
TARGET=username
TARGET_DIR="~${TARGET}/.ssh"
Ich möchte, dass der TARGET_DIR
var diesen Pfad beibehält: /home/username/.ssh
aber ~
anstelle von verwendet /home/
. Aber wenn ich das Skript starte und versuche, ein neues .ssh
Verzeichnis 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?
Antworten:
In
bash
,ash
,mksh
undyash
tritt Tilde - Erweiterung vor Parameter Expansion, so arbeiten , dass nicht.Sie können
ksh93
oderzsh
stattdessen hier verwenden oder auf Folgendes zurückgreifeneval
:Wenn Ihr System einen
getent
Befehl hat (heutzutage sehr verbreitet), können Sie auch Folgendes verwenden:Oder verwenden
perl
:Das würde auch mit Benutzern funktionieren, deren Benutzername ungewöhnliche Zeichen enthält (wie zshs,
~$user
aber nichtksh93
zshs,~"$user"
die ebenfalls ein Problem haben würden).quelle
~$user
würde diese nach~username
und dann nach erweitert werden/home/userhome
. Aber es ist umgekehrt. Wenn Sie einen Benutzer , dessen Benutzernamen hatte , war$user
,~$user
auf das Home - Verzeichnis des Benutzers erweitern würden (inbash
, nicht inash
/mksh
/yash
wo das~$user
ist 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 nurbash
in dieser Hinsicht konform ist (in anderen Fällen ist die POSIX-Spezifikation jedoch nicht klar).