Warum schlägt der Befehl mkdir fehl mit: "Keine solche Datei oder kein solches Verzeichnis"?
#!/bin/bash
set -e
BIN_DIR="~/bin/"
if [ ! -d "$BIN_DIR" ]; then
mkdir "$BIN_DIR"
fi
command-line
bash
scripts
home-directory
mkdir
Hendré
quelle
quelle
Antworten:
Die Fehlermeldung wird ausgegeben, weil die Tilde
~
zitiert wird, wie in Zannas Antwort beschrieben . Wenn Sie das verwenden möchten~
, sollte der relevante Teil des Skripts sein:Wenn Sie die Zeichenfolge aus irgendeinem Grund in Anführungszeichen setzen möchten, können Sie die Umgebungsvariable verwenden
$HOME
:Meiner Meinung nach ist der zweite Ansatz eine bessere Praxis.
quelle
~
Skripte zu verwenden. Es funktioniert genauso wie in der Befehlszeile. Das Problem ist, dass das Zitieren die Tilde-Expansion blockiert, wie in Zannas Antwort erläutert .$HOME
in Skripten eine gute Idee ist.$HOME
als eine Tilde-Erweiterung zu verwenden? Die einzige Erklärung, die Sie gegeben haben, ist zu sagen: "Es ist eine bessere Idee, weil Sie weniger Aufmerksamkeit schenken sollten." Ich habe keine Ahnung was das heißt. Können Sie es in einer Bearbeitung erläutern? Ohne sie gibt es nichts, was Ihre Antwort stützt, also gehört sie sicherlich dazu. Tilde - Erweiterung wurde von POSIX , die für eine ganze Weile und die Hash - Bang Zeile des Skripts ist#!/bin/bash
also nehme ich an Portabilität ist nicht der Grund.Es funktioniert nicht, weil
~
zitiert wird. Doppelte Anführungszeichen"
unterdrücken die Tilde-Erweiterung . Es gibt kein Verzeichnis mit dem Literalnamen~/bin
. Wie inman bash
(Hervorhebung von mir) erklärt:Sie können die Anführungszeichen entfernen , da dies
~
das einzige Zeichen im Pfad ist~/bin
, das bewirkt, dass die Shell eine Erweiterung ausführt. In diesem Fall möchten wir die Erweiterung. Die Shell führt keine weiteren Erweiterungen für das Ergebnis der Tilde-Erweiterung durch, zumindest nicht in Bash 4 , das alle aktuellen oder remote aktuellen Ubuntu-Versionen haben . Selbst wenn Ihr Home-Verzeichnis ungewöhnliche Zeichen wie Leerzeichen enthält, ist dies in Ordnung.Oder Sie können
$HOME
anstelle von verwenden~
, da die Parametererweiterung nicht durch doppelte Anführungszeichen, sondern nur durch einfache Anführungszeichen unterdrückt wird . Die doppelten Anführungszeichen stellen sicher, dass der erweiterte Wert selbst keinen weiteren Erweiterungen unterliegt, sodass keine Wortaufteilung oder Dateinamenerweiterung erfolgt. Funktioniert also$HOME
auch mit seltsam benannten Home-Verzeichnissen, solange Sie die doppelten Anführungszeichen behalten.quelle
cd '~'
ist-bash: cd: ~: No such file or directory
.~
ist nicht Teil der Parametererweiterung.