Wie man eine spezielle Variable (zB: ~ Tilde) in bash manuell expandiert
Ich habe eine variable in meinem bash-Skript, dessen Wert ist, so etwas wie dieses:
~/a/b/c
Beachten Sie, dass es nicht aufgegliederten tilde. Wenn ich ls -lt auf diese variable (nennen wir es $VAR), bekomme ich kein solches Verzeichnis. Ich möchte die bash interpretieren/erweitern Sie diese variable, ohne Sie auszuführen. In anderen Worten, ich möchte die bash ausführen, eval, aber nicht ausgeführt der Befehl ausgewertet. Ist das möglich in der bash?
Wie kam ich zu verwalten, zu übergeben, diese in mein Skript ohne Erweiterung? Ich ging ein argument, um es mit doppelten Anführungszeichen.
Diesen Befehl ausprobieren, um zu sehen, was ich meine:
ls -lt "~"
Dies ist genau die situation, die ich bin in. Ich will die tilde erweitert werden. In anderen Worten, was sollte ich ersetzen magic mit machen diese beiden Befehle identisch:
ls -lt ~/abc/def/ghi
und
ls -lt $(magic "~/abc/def/ghi")
Beachten Sie, dass ~/abc/def/ghi möglicherweise oder ist nicht vorhanden.
InformationsquelleAutor der Frage madiyaan damha | 2010-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufgrund der Natur von StackOverflow, ich kann nicht nur diese Antwort nicht akzeptierten, aber in den vergangenen 5 Jahren, seit ich dies geschrieben, es wurden weitaus bessere Antworten als meine zugegebenermaßen rudimentär und ziemlich schlecht zu beantworten (ich war jung, töten Sie mich nicht).
Den anderen Lösungen in diesem thread sind sicherere und bessere Lösungen. Vorzugsweise würde ich diese beiden:
Ursprüngliche Antwort für historische Zwecke (aber bitte nicht verwenden)
Wenn ich mich nicht Irre,
"~"
werden nicht erweitert, durch ein bash-Skript ist in dieser Form, weil es wie eine Literalzeichenfolge behandelt"~"
. Sie können erzwingen, dass die expansion übereval
wie diese.Alternativ verwenden Sie einfach
${HOME}
wenn Sie möchten, dass der Benutzer-home-Verzeichnis.InformationsquelleAutor der Antwort wkl
Wenn die variable
var
ist die Eingabe durch den Benutzer,eval
sollte nicht werden verwendet, um zu erweitern die tilde überDer Grund ist: der Benutzer könnte durch einen Unfall (oder Zweck) geben zum Beispiel
var="$(rm -rf $HOME/)"
mit möglichen katastrophalen Folgen.Besser (und sicherer) Weg ist die Benutzung von Bash parameter expansion:
InformationsquelleAutor der Antwort Håkon Hægland
Plagarizing mich von eine Vorherige Antwortdazu robust, ohne die Sicherheitsrisiken, die mit
eval
:...als...
Abwechselnd ein einfacher Ansatz, der verwendet
eval
gezielt:InformationsquelleAutor der Antwort Charles Duffy
Einen sicheren Weg, um mit eval ist
"$(printf "~/%q" "$dangerous_path")"
. Beachten Sie, dass ist bash-spezifisch.Sehen diese Frage für details
Beachten Sie auch, dass unter zsh wäre das genauso so einfach wie
echo ${~dangerous_path}
InformationsquelleAutor der Antwort eddygeek
Ausbau (kein Wortspiel beabsichtigt) auf birryree und halloleo Antworten: Der Allgemeine Ansatz ist die Verwendung
eval
aber es kommt mit einige wichtige Vorbehalte, nämlich Räume und Ausgabe-Umleitung (>
) in die variable. Die folgende scheint zu funktionieren für mich:Versuchen Sie es mit den folgenden Argumenten:
Erklärung
${mypath//>}
Streifen>
Zeichen, die könnte clobber eine Datei während dereval
.eval echo ...
ist, was macht die eigentliche tilde-expansion-e
argument für die Unterstützung von Dateinamen mit Leerzeichen.Vielleicht gibt es eine elegantere Lösung, aber das ist, was ich war in der Lage zu kommen mit.
InformationsquelleAutor der Antwort Noach Magedman
Wie wäre es damit:
Oder:
InformationsquelleAutor der Antwort Jay
Ich glaube, das ist das, was Sie suchen
Beispiel:
InformationsquelleAutor der Antwort Orwellophile
Hier ist meine Lösung:
InformationsquelleAutor der Antwort Gino
Verwenden Sie einfach
eval
richtig: mit Validierung.InformationsquelleAutor der Antwort mikeserv
Hier ist die POSIX-Funktion äquivalent von Håkon Hægland die Bash Antwort
2017-12-10 Bearbeiten: hinzufügen
'%s'
pro @CharlesDuffy in die Kommentare.InformationsquelleAutor der Antwort go2null
Nur zu verlängern birryree's Antwort für Pfade mit Leerzeichen: Sie können das
eval
Befehl da ist, denn es trennt die Auswertung durch die Räume. Eine Lösung ist, ersetzen Sie Räume vorübergehend für den eval-Befehl:Dieses Beispiel beruht natürlich auf der Annahme, dass
mypath
nie enthält die char-Sequenz"_spc_"
.InformationsquelleAutor der Antwort halloleo
Vielleicht finden Sie diese einfacher in python.
(1) Von der unix-Befehlszeile:
Ergebnisse in:
(2) In ein bash-Skript als ein-aus - speichern Sie diese als
test.sh
:Läuft
bash ./test.sh
Ergebnisse in:(3) Als ein Dienstprogramm - speichern Sie diese als
expanduser
irgendwo auf Ihrem Weg, mit Berechtigungen ausführen:Diese könnten dann verwendet werden, auf der Kommandozeile:
Oder in einem Skript:
InformationsquelleAutor der Antwort Chris Johnson
Einfachste: ersetzen Sie 'magic' mit 'eval echo'.
Problem: Du gehst zu laufen in Probleme mit anderen Variablen, denn eval ist böse. Zum Beispiel:
Beachten Sie, dass das Problem von der Einspritzung nicht passiert, die erste Erweiterung. Also, wenn Sie ersetzen Sie einfach
magic
miteval echo
Sie sollten in Ordnung sein. Aber wenn Sie das tunecho $(eval echo ~)
das wäre anfällig für injection.Ähnlich, wenn Sie
eval echo ~
statteval echo "~"
wäre, würde das zählen als zweimal erweitert und daher injection wäre möglich sofort.InformationsquelleAutor der Antwort Karim Alibhai