Bash-Skriptquelle: Keine solche Datei oder kein solches Verzeichnis

9

Ich habe ein Skript, das so beginnt

#!/bin/bash
VALKYRIE=~/myProjects/valkyrie
source $VALKYRIE/cluster.conf

aber wenn ich es starte, kehrt es zurück line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

Aber die Datei existiert und wenn ich sie ausführe source ~/myProjects/valkyrie/cluster.conf, läuft sie einwandfrei. Irgendeine Idee? Ich habe die VALKYRIEVariable an anderer Stelle festgelegt, sodass Hardcode im Pfad keine Option ist.

Khoi
quelle
Ich bin nicht 100% sicher, ob dies helfen wird, aber Sie könnten versuchen, die Variable vollständig in Anführungszeichen zu setzen, falls in ~ Leerzeichen vorhanden sind. Daher source "${VALKYRIE}/cluster.conf".
Sparhawk
Nein, es hilft nicht.
Khoi
1
Ich denke, das hat damit zu tun, dass man ~nicht richtig expandiert. Wenn ich Ihr Skript mit einem absichtlich gefälschten Pfad ausführe, sagt der Fehler nicht ~, sondern erweitert den Pfad. Können Sie versuchen, das ~in Ihrem Skript durch den absoluten Pfad zu ersetzen ? Versuchen Sie außerdem, Folgendes in einem Skript auszuführen echo ~.
Sparhawk
2
Sie könnten es auch versuchen $HOMEstatt ~.
Sparhawk
3
@ Khoi Das erklärt es. ~/.pam_environmentist kein Shell-Skript, daher macht es nicht die üblichen Dinge, die Sie von einer Shell erwarten würden, wie z. B. Tilde-Erweiterung und Parameter-Erweiterung~ noch $HOMEersetzt werden. Wenn Sie diese Zeile ~/.profilestattdessen nach verschieben und export vorne hinzufügen , sollte dies funktionieren.
Geirha

Antworten:

8

~scheint sich nicht richtig auszudehnen. Wenn ich Ihr Skript mit einem absichtlich gefälschten Pfad ausführe, sagt der Fehler nicht ~, sondern erweitert den Pfad (dh /home/sparhawk/fakepathnicht ~/fakepath. Sie können versuchen, $HOMEstattdessen ~den vollständigen Pfad im Skript zu verwenden oder stattdessen den vollständigen Pfad zu verwenden.

(Ich bin nicht sicher, warum ~es auf Ihrem System nicht funktioniert, da Ihr Skript für mich gut funktioniert.)

Sparhawk
quelle
Wenn Sie sich die Reihenfolge ansehen, in der bash Erweiterungen ausführt ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ), werden Sie feststellen , dass die Tilde-Erweiterung vor der variablen Erweiterung erfolgt. Deshalb $HOMEist es besser als ~in einer Variablen
Glenn Jackman
@glennjackman Ich bin nicht sicher, ob ich verstehe. Warum sollte Priorität für Variablen von Bedeutung sein ~?
Sparhawk
1
Es ist nicht gerade "Priorität", es ist einfach das, was zuerst kommt. Bedenken Sie x="~/.bashrc"; ls $x: In der Reihenfolge der Erweiterungen für den Befehl "ls" sucht bash nach einer Tilde und findet keine. Schließlich sieht bash eine Variable und erweitert sie. bash geht nicht zurück und sucht wieder nach Tildes, an diesem Punkt ist es nur ein einfacher Charakter. und es gibt keine Dateien im aktuellen Verzeichnis, die mit einer Tilde beginnen.
Glenn Jackman
Ah okay. Ich glaube ich verstehe. Ich habe mich immer gefragt, warum dieser Befehl fehlschlägt und x=~/".bashrc"; ls $xfunktioniert. Danke für die Information.
Sparhawk