Ich habe eine Bash-Skript-Datei, die unter einem Verzeichnis abgelegt wird, das zu $ PATH hinzugefügt wurde, damit ich das Skript von einem beliebigen Verzeichnis aus aufrufen kann.
Es gibt eine andere Textdatei im selben Verzeichnis wie das Skript. Ich frage mich, wie ich auf die Textdatei im Skript verweisen soll.
Wenn das Skript beispielsweise nur den Inhalt der Textdatei ausgeben soll, cat textfile
funktioniert dies nicht, da die Textdatei beim Aufrufen des Skripts aus einem anderen Verzeichnis nicht gefunden wird.
Antworten:
Diese sollten genauso funktionieren, solange keine Symlinks vorhanden sind (in der Pfaderweiterung oder im Skript selbst):
MYDIR="$(dirname "$(realpath "$0")")"
MYDIR="$(dirname "$(which "$0")")"
Eine zweistufige Version eines der oben genannten:
MYSELF="$(realpath "$0")"
MYDIR="${MYSELF%/*}"
Wenn sich auf dem Weg zu Ihrem Skript ein Symlink befindet, erhalten Sie
which
eine Antwort, in der die Auflösung dieses Links nicht enthalten ist. Wennrealpath
es nicht standardmäßig auf Ihrem System installiert ist, finden Sie es hier .[BEARBEITEN]: Da es
realpath
keinen Vorteil gegenüberreadlink -f
Caleb gibt , ist es wahrscheinlich besser, Letzteres zu verwenden. Meine Timing-Tests zeigen, dass es tatsächlich schneller ist.quelle
realpath
das auf deinem System her? (Für andere, die es nicht haben, können Sie verwendenreadlink -f
realpath
stammt aus der Zeit vorreadlink -f
(und sogarreadlink
IIRC) als GNU-Coreutils (es gab mehrere ähnliche Tools). Wurdereadlink -f
schließlich zum De-facto-Standard.realpath
wird nur aus Kompatibilitätsgründen mit Skripten aufbewahrt, die es noch verwenden.$(dirname "$(which "$0")")
gegenüber$(dirname $0)
wo daswhich
nicht mehr vorhanden ist? Ist es nicht dasselbe?readlink -f
scheint nicht unter Mac OS X 10.11.6 zu funktionieren,realpath
funktioniert aber sofort .Meine Systeme haben nicht
realpath
wie von rozcietrzewiacz vorgeschlagen .Sie können dies mit dem
readlink
Befehl ausführen. Der Vorteil gegenüber dem Parsenwhich
oder anderen Lösungen besteht darin, dass Sie auch dann das Verzeichnis finden können, in dem sich die eigentliche Datei befindet, wenn ein Teil des ausgeführten Pfads oder Dateinamens ein Symlink ist.Ihre Textdatei könnte dann in eine Variable wie diese eingelesen werden:
quelle
which
Vorschlag bezogen. Die normale Lösung hierfür ist entweder nurdirname
oder eine Kombination voncd
undpwd
in einer Unterschale. Readlink hat hier den Vorteil.realpath
scheint so ziemlich nur eine Verpackung fürreadlink -f
sowieso zu sein.realpath
sich das unterscheidetreadlink -f
. Ich kann nur sehen, dass es mir die gleichen Ergebnisse liefert (im Gegensatz zuwhich
).readlink -f
(von GNU coreutils) NICHT das letzte Element des Pfades benötigt, das vorhanden ist,readlink -e
dies aber nicht unterstütztbusybox readlink
, was das Verhalten-e
in ihrer-f
Option nachahmt .$0
Im Skript wird der vollständige Pfad zum Skript angegeben, und esdirname
wird ein vollständiger Pfad angegeben, in dem nur das Verzeichnis angegeben wird. Sie können also folgendermaßen vorgehen, um eine Katzentextdatei zu erstellen:quelle
realpath $0
, sind Sie falsch zu sagen, dass "$0
im Skript der vollständige Pfad zum Skript sein wird".$0
ist der befehl wie er ausgeführt wurde, das kann zb../script.sh
.$(dirname "$0")
den relativen Pfad zum Skript als Teil des aufgerufenen Befehls zurück - nicht den absoluten Pfad. Dies kann zu Problemen in Skripten führen, bei denen die Verzeichnisse während der Ausführung geändert werden.Sie können dies oben in Ihr Skript einfügen:
Quelle: http://mywiki.wooledge.org/BashFAQ/028
quelle
Ich habe das ausprobiert und realpath hat bei mir nicht funktioniert. Die Lösung, die ich gewählt habe, ist:
Welches hat bisher gut funktioniert. Ich würde gerne wissen, ob es irgendwelche potenziellen Probleme mit dem Ansatz gibt.
quelle
SCRIPT_DIR="$( cd "$(dirname "$( readlink -f ${BASH_SOURCE[0]} )")" >/dev/null 2>&1 && pwd)"
Ich benutze:
Was POSIX ist und funktionieren sollte, solange der Verzeichnisname von
$0
nicht mit Zeilenumbrüchen endet, ist-
und$CDPATH
wird nicht gesetzt (und möglicherweise ein paar andere Eckfälle, wenn das Skript nicht nachgeschlagen wurde$PATH
).quelle
Ich benutze immer
which
, um den vollständigen Pfad einer ausführbaren Datei aus dem Pfad zu finden. Zum Beispiel:which python
Wenn Sie dies mit dem
dirname
Befehl kombinieren, erhalten Sie:quelle