Wie erhalte ich den Pfad des Verzeichnisses, in dem sich ein Bash- Skript befindet, innerhalb dieses Skripts?
Ich möchte ein Bash-Skript als Starter für eine andere Anwendung verwenden. Ich möchte das Arbeitsverzeichnis in das Arbeitsverzeichnis ändern, in dem sich das Bash-Skript befindet, damit ich die Dateien in diesem Verzeichnis wie folgt bearbeiten kann:
$ ./application
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- und es ohne Befehlsersetzung entfernen -DIR="${DIR%x}"
.mkdir $'\n'
.dirname
und dass das Verzeichnis mit einem-
(z--help
. B. ) beginnen könnte.DIR=$(reldir=$(dirname -- "$0"; echo x); reldir=${reldir%?x}; cd -- "$reldir" && pwd && echo x); DIR=${DIR%?x}
. Vielleicht ist das übertrieben?Antworten:
ist ein nützlicher Einzeiler, der Ihnen den vollständigen Verzeichnisnamen des Skripts gibt, unabhängig davon, von wo es aufgerufen wird.
Dies funktioniert so lange, wie die letzte Komponente des Pfads, mit der das Skript gefunden wird, kein Symlink ist (Verzeichnisverknüpfungen sind in Ordnung). Wenn Sie auch Links zum Skript selbst auflösen möchten, benötigen Sie eine mehrzeilige Lösung:
Das letzte wird mit einer beliebigen Kombination von Alias - Namen arbeiten,
source
,bash -c
, Symlinks, usw.Achtung: Wenn Sie
cd
sich vor dem Ausführen dieses Snippets in einem anderen Verzeichnis befinden, ist das Ergebnis möglicherweise falsch!$CDPATH
Achten Sie auch auf Fallstricke und Nebenwirkungen bei der Ausgabe von stderr, wenn der Benutzer die CD intelligent überschrieben hat, um die Ausgabe stattdessen an stderr umzuleiten (einschließlich Escape-Sequenzen, z. B. beim Aufrufenupdate_terminal_cwd >&2
auf einem Mac). Durch Hinzufügen>/dev/null 2>&1
am Ende Ihrescd
Befehls werden beide Möglichkeiten berücksichtigt.Versuchen Sie, diese ausführlichere Form auszuführen, um zu verstehen, wie es funktioniert:
Und es wird so etwas wie gedruckt:
quelle
source <script>
und funktioniertbash <script>
:DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
.cd
Druckt manchmal etwas an STDOUT! Zum Beispiel, wenn Ihr$CDPATH
hat.
. Um diesen Fall abzudecken, verwenden SieDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )"
dirname $(readlink -f $0)
ist der richtige Befehl. Siehe gist.github.com/tvlooy/cbfbdb111a4ebad8b93e für einen Testfalldirname "$(readlink -f "$0")"
erhöht die Komplexität nicht und ist bei minimalem Aufwand angemessen robuster.readlink -f $0
gibtreadlink: illegal option -- f
.Verwendung
dirname "$0"
:Die
pwd
alleinige Verwendung funktioniert nicht, wenn Sie das Skript nicht in dem Verzeichnis ausführen, in dem es enthalten ist.quelle
type -p
wenn das Skript ausführbar ist. Dies kann auch eine subtile Lücke öffnen, wenn das Skript mit ausgeführt wirdbash test2.sh
und ein anderes Skript mit demselben Namen an einer anderen Stelle ausführbar ist.bash
und die Hash-Bang-Zeile ausdrücklich erwähnt,/bin/bash
würde ich sagen, dass es ziemlich sicher ist, sich auf Bashismen zu verlassen.dirname $0
ist, dass Sie erhalten, wenn das Verzeichnis das aktuelle Verzeichnis ist.
. Das ist in Ordnung, es sei denn, Sie ändern die Verzeichnisse im Skript und erwarten, dass Sie den Pfad verwenden, von dem Sie ihn erhalten haben,dirname $0
als wäre er absolut. Um den absoluten Pfad:pushd `dirname $0` > /dev/null
,SCRIPTPATH=`pwd`
,popd > /dev/null
: pastie.org/1489386 (Aber sicher gibt es einen besseren Weg , diesen Weg zu erweitern?)dirname $0
es ein Problem ist, wenn Sie es einer Variablen zuweisen und dann ein Skript wie dieses starten$dir/script.sh
. Ich würde mir vorstellen, dass dies in 90% der Fälle der Anwendungsfall für diese Art von Dingen ist../script.sh
würde gut funktionieren.Der
dirname
Befehl ist der einfachste und analysiert einfach den Pfad bis zum Dateinamen aus der$0
Variablen (Skriptname):Wie matt b hervorhob, ist der zurückgegebene Pfad jedoch unterschiedlich, je nachdem, wie das Skript aufgerufen wird.
pwd
führt den Job nicht aus, da dies nur angibt, in welchem Verzeichnis sich das aktuelle Verzeichnis befindet und nicht in welchem Verzeichnis sich das Skript befindet. Wenn außerdem eine symbolische Verknüpfung zu einem Skript ausgeführt wird, erhalten Sie einen (wahrscheinlich relativen) Pfad zu Wo sich der Link befindet, nicht das eigentliche Skript.Einige andere haben den
readlink
Befehl erwähnt, aber im einfachsten Fall können Sie Folgendes verwenden:readlink
löst den Skriptpfad in einen absoluten Pfad vom Stammverzeichnis des Dateisystems auf. Alle Pfade, die einfache oder doppelte Punkte, Tildes und / oder symbolische Links enthalten, werden in einen vollständigen Pfad aufgelöst.Hier ist ein Skript, das jedes dieser Elemente demonstriert
whatdir.sh
:Ausführen dieses Skripts in meinem Ausgangsverzeichnis unter Verwendung eines relativen Pfads:
Nochmals, aber unter Verwendung des vollständigen Pfads zum Skript:
Jetzt Verzeichnisse wechseln:
Und schließlich einen symbolischen Link verwenden, um das Skript auszuführen:
quelle
readlink
wird in einigen Plattformen in der Standardinstallation nicht verfügbar sein. Versuchen Sie, es zu vermeiden, wenn Sie könnenexport SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
-f
nicht als Option für erkanntreadlink
. Verwenden Siestat -f
stattdessen den Job. Dankegreadlink
im Grunde das, wasreadlink
wir alle kennen. Hier ist eine plattformunabhängige Version:dir=`greadlink -f ${BASH_SOURCE[0]} || readlink -f ${BASH_SOURCE[0]}`
greadlink
brew install coreutils
Funktioniert für alle Versionen, einschließlich
source
" aka.
(Punkt-) Operator aufgerufen wird .$0
vom Aufrufer geändert wird."./script"
"/full/path/to/script"
"/some/path/../../another/path/script"
"./some/folder/script"
Wenn das Bash-Skript selbst ein relativer Symlink ist , möchten Sie ihm alternativ folgen und den vollständigen Pfad des verknüpften Skripts zurückgeben:
SCRIPT_PATH
wird im vollen Pfad gegeben, egal wie es heißt.Stellen Sie einfach sicher, dass Sie dies am Anfang des Skripts finden.
Dieser Kommentar und Code Copyleft, auswählbare Lizenz unter der GPL2.0 oder höher oder CC-SA 3.0 (CreativeCommons Share Alike) oder höher. (c) 2008. Alle Rechte vorbehalten. Keine Garantie jeglicher Art. Du wurdest gewarnt.
http://www.gnu.org/licenses/gpl-2.0.txt
http://creativecommons.org/licenses/by-sa/3.0/
18eedfe1c99df68dc94d4a94712a71aaa8e1e9e36cacf421b9463dd2bbaa02906d06
quelle
readlink -f $(dirname "${VIRTUAL_ENV}")
;dirname "${SCRIPT_PATH}"
&& pwd) zu verwenden? Aber trotzdem tolles Drehbuch!cd
sein aktuelles Verzeichniscd
verlässt, in der Hoffnung, später wieder zurück zu kommen: Das Skript hat möglicherweise nicht die Berechtigung, das Verzeichnis wieder in das Verzeichnis zu ändern, das beim Aufrufen aktuell war. (Gleiches gilt für pushd / popd)readlink -f
ist GNU-spezifisch. BSDreadlink
hat diese Option nicht.([ ... ])
ist weniger effizient als[ ... ]
und es wird kein Vorteil aus der Isolation gezogen, die als Gegenleistung für diesen hier erzielten Leistungseinbruch angeboten wird.Kurze Antwort:
oder ( vorzugsweise ):
quelle
source
undcd $(dirname $0)
ist leicht zu merken.${BASH_SOURCE[0]}
anstatt mit zu$0
arbeitensource my/script.sh
${BASH_SOURCE[0]}
ist überhaupt nicht zufriedenstellend.${BASH_SOURCE:-0}
ist viel besser.Sie können verwenden
$BASH_SOURCE
:Beachten Sie, dass Sie verwenden müssen
#!/bin/bash
und nicht,#!/bin/sh
da es sich um eine Bash-Erweiterung handelt.quelle
./foo/script
, dann$(dirname $BASH_SOURCE)
ist es./foo
.realpath
Befehl verwenden, um den vollständigen Pfad von ./foo/script zu erhalten. Sodirname $(realpath ./foo/script)
wird der Pfad des Skripts geben.Dies sollte es tun:
Dies funktioniert mit Symlinks und Leerzeichen im Pfad.
Siehe die Manpages für
dirname
undreadlink
.Aus der Kommentarspur geht hervor, dass es unter Mac OS nicht funktioniert. Ich habe keine Ahnung warum das so ist. Irgendwelche Vorschläge?
quelle
./script.sh
Shows.
anstelle des vollständigen Verzeichnispfads aufstat
stattdessen. Trotzdem zeigt es,.
ob Sie sich in diesem Verzeichnis befinden.coreutils
von Homebrew installieren und verwendengreadlink
, um die-f
Option unter MacOS zu erhalten, da es sich um * BSD unter der Decke und nicht um Linux handelt.DIR="$(dirname "$(readlink -f "$0")")"
pwd
kann verwendet werden, um das aktuelle Arbeitsverzeichnis unddirname
das Verzeichnis einer bestimmten Datei zu finden (Befehl, der ausgeführt wurde, ist$0
,dirname $0
sollte Ihnen also das Verzeichnis des aktuellen Skripts geben).Allerdings
dirname
gibt genau das Verzeichnis Teil des Dateinamens, die eher als nicht auf das aktuelle Arbeitsverzeichnis ist relativ wird. Wenn Ihr Skript aus irgendeinem Grund das Verzeichnis wechseln muss, ist die Ausgabe vondirname
bedeutungslos.Ich schlage folgendes vor:
Auf diese Weise erhalten Sie ein absolutes und kein relatives Verzeichnis.
Da das Skript in einer separaten Bash-Instanz ausgeführt wird, muss das Arbeitsverzeichnis anschließend nicht wiederhergestellt werden. Wenn Sie jedoch aus irgendeinem Grund wieder Änderungen an Ihrem Skript vornehmen möchten, können Sie den Wert von problemlos
pwd
einer Variablen vor Ihnen zuweisen Verzeichnis ändern, für zukünftige Verwendung.Obwohl nur
Löst das spezifische Szenario in der Frage, finde ich den absoluten Weg allgemein nützlicher.
quelle
dirname $0
&& pwd)Ich bin es leid, immer wieder auf diese Seite zu kommen, um den Einzeiler in die akzeptierte Antwort einzufügen. Das Problem dabei ist, dass es nicht leicht zu verstehen und sich zu erinnern ist.
Hier ist ein leicht zu merkendes Skript:
quelle
DIR=$(realpath "$(dirname "${BASH_SOURCE[0]}")")
realpath
"manuellen" Auflösen mit einer Schleife vonreadlink
? Sogar diereadlink
Manpage sagtNote realpath(1) is the preferred command to use for canonicalization functionality.
realpath
vorherdirname
und nicht nachher bewerben ? Wenn die Skriptdatei selbst ein Symlink ist ... würde es so etwas gebenDIR="$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
. Eigentlich sehr nah an der Antwort von Simon.Ich denke nicht, dass dies so einfach ist, wie andere es sich vorgestellt haben.
pwd
funktioniert nicht, da das aktuelle Verzeichnis nicht unbedingt das Verzeichnis mit dem Skript ist.$0
hat auch nicht immer die Informationen. Betrachten Sie die folgenden drei Möglichkeiten, um ein Skript aufzurufen:Auf die erste und dritte Weise
$0
verfügt nicht über die vollständigen Pfadinformationen. Im zweiten und drittenpwd
funktioniert nicht. Die einzige Möglichkeit, das Verzeichnis auf die dritte Weise abzurufen, besteht darin, den Pfad zu durchlaufen und die Datei mit der richtigen Übereinstimmung zu finden. Grundsätzlich müsste der Code wiederholen, was das Betriebssystem tut.Eine Möglichkeit, das zu tun, was Sie verlangen, besteht darin, die Daten im
/usr/share
Verzeichnis einfach fest zu codieren und auf ihren vollständigen Pfad zu verweisen. Daten sollten sich/usr/bin
sowieso nicht im Verzeichnis befinden, daher ist dies wahrscheinlich die richtige Vorgehensweise .quelle
quelle
$0
nochpwd
garantiert.quelle
$BASH_SOURCE
es$0
, weil es explizit ist, selbst für Leser, die sich mit Bash nicht auskennen.$(dirname -- "$(readlink -f -- "$BASH_SOURCE")")
Dadurch wird das aktuelle Arbeitsverzeichnis unter Mac OS X 10.6.6 abgerufen:
quelle
Dies ist Linux-spezifisch, aber Sie könnten verwenden:
quelle
/proc/fd/$$/255
scheint auf das tty zu verweisen, nicht auf ein Verzeichnis. In meiner aktuellen Anmeldeshell beziehen sich beispielsweise die Dateideskriptoren 0, 1, 2 und 255 auf/dev/pts/4
. In jedem Fall wird im Bash-Handbuch fd 255 nicht erwähnt, daher ist es wahrscheinlich unklug, sich auf dieses Verhalten zu verlassen. \realpath ${BASH_SOURCE[0]};
Fall scheint der beste Weg zu sein.Hier ist ein POSIX-kompatibler Einzeiler:
quelle
cd
konfiguriert ist, den neuen Pfadnamen zu drucken.Ich habe all dies versucht und keines hat funktioniert. Einer war sehr nah dran, hatte aber einen winzigen Fehler, der ihn schwer brach; Sie haben vergessen, den Pfad in Anführungszeichen zu setzen.
Viele Leute gehen auch davon aus, dass Sie das Skript über eine Shell ausführen, sodass sie vergessen, wenn Sie ein neues Skript öffnen, das standardmäßig zu Hause verwendet wird.
Probieren Sie dieses Verzeichnis für die Größe an:
Dies macht es richtig, unabhängig davon, wie oder wo Sie es ausführen:
Um es tatsächlich nützlich zu machen, gehen Sie wie folgt in das Verzeichnis des laufenden Skripts:
quelle
ln -s ../bin64/foo /usr/bin/foo
).Hier ist der einfache, richtige Weg:
Erläuterung:
${BASH_SOURCE[0]}
- den vollständigen Pfad zum Skript. Der Wert ist auch dann korrekt, wenn das Skript bezogen wird, z. B. Bashsource <(echo 'echo $0')
druckt. Wenn Sie es durch ersetzen, wird der vollständige Pfad des Skripts gedruckt. (Dies setzt natürlich voraus, dass Sie eine Abhängigkeit von Bash haben.)${BASH_SOURCE[0]}
readlink -f
- Löst rekursiv alle Symlinks im angegebenen Pfad auf. Dies ist eine GNU-Erweiterung und auf (zum Beispiel) BSD-Systemen nicht verfügbar. Wenn Sie einen Mac verwenden, können Sie GNUcoreutils
mit Homebrew installieren und durch ersetzengreadlink -f
.Und natürlich
dirname
bekommt das übergeordnete Verzeichnis des Pfades.quelle
greadlink -f
Leider funktioniert es nicht effektiv, wennsource
das Skript auf dem Mac ausgeführt wird :(Der kürzeste und eleganteste Weg, dies zu tun, ist:
Dies würde auf allen Plattformen funktionieren und ist super sauber.
Weitere Details finden Sie unter "In welchem Verzeichnis befindet sich das Bash-Skript? ".
quelle
Ich würde so etwas verwenden:
quelle
sh
! Problem mit einfachendirname "$0"
Lösungen: Wenn sich das Skript im befindet$PATH
und ohne Pfad aufgerufen wird, führen sie zu einem falschen Ergebnis.PATH
,$0
wird die absoluten Dateinamen enthalten. Wenn das Skript mit einem relativen oder absoluten Dateinamen aufgerufen wird , enthalten ein/
,$0
wird diese enthalten.Dies ist eine geringfügige Überarbeitung der Lösung e-satis und 3bcdnlklvc04a, auf die in ihrer Antwort hingewiesen wurde :
Dies sollte in allen aufgeführten Fällen weiterhin funktionieren.
Dies wird
popd
nach einempushd
Fehlschlag dank konsolebox verhindert.quelle
SCRIPT_DIR=''; pushd "$(dirname "$(readlink -f "$BASH_SOURCE")")" > /dev/null && { SCRIPT_DIR=$PWD; popd > /dev/null; }
popd
in Fällen (auch in seltenen Fällen) zu vermeiden, in denen diespushd
fehlschlägt. Und falls diespushd
fehlschlägt, was sollte Ihrer Meinung nach der Wert von seinSCRIPT_DIR
? Die Aktion kann variieren, je nachdem, was logisch erscheint oder was ein Benutzer bevorzugen könnte, aber das ist sicherlichpopd
falsch.pushd
popd
Gefahren könnten vermieden werden, indem man sie einfach fallen lässt und stattdessencd
+pwd
in einer Befehlssubstitution verwendet.SCRIPT_DIR=$(...)
Für Systeme mit GNU-Coreutils
readlink
(z. B. Linux):Es ist nicht erforderlich,
BASH_SOURCE
wenn$0
das Skript den Dateinamen enthält.quelle
dirname
Anruf hinzugefügt . Wird benötigt, wenn der Verzeichnispfad Leerzeichen enthält.quelle
$0
funktioniert nicht für ein Sourcing-Skript$_
ist als Alternative zu erwähnenswert$0
. Wenn Sie ein Skript von Bash ausführen, kann die akzeptierte Antwort wie folgt gekürzt werden:Beachten Sie, dass dies die erste Anweisung in Ihrem Skript sein muss.
quelle
source
oder.
das Skript. In diesen Situationen$_
würde der letzte Parameter des letzten Befehls enthalten sein, den Sie vor dem ausgeführt haben.
.$BASH_SOURCE
funktioniert jedes Mal.Ich habe viele der gegebenen Antworten verglichen und kompaktere Lösungen gefunden. Diese scheinen alle verrückten Randfälle zu behandeln, die sich aus Ihrer Lieblingskombination ergeben:
script
,bash script
,bash -c script
,source script
, oder. script
Wenn Sie unter Linux arbeiten, ist die Verwendung des
proc
Handles anscheinend die beste Lösung, um die vollständig aufgelöste Quelle des aktuell ausgeführten Skripts zu finden (in einer interaktiven Sitzung verweist der Link auf das jeweilige/dev/pts/X
):Dies hat ein wenig Hässlichkeit, aber die Lösung ist kompakt und leicht zu verstehen. Wir verwenden nicht nur Bash-Grundelemente, aber ich bin damit einverstanden, da dies
readlink
die Aufgabe erheblich vereinfacht. Dasecho X
fügtX
am Ende der Variablenzeichenfolge ein hinzu, damit nachfolgende Leerzeichen im Dateinamen nicht gegessen werden und die Parametersubstitution${VAR%X}
am Ende der Zeile das entferntX
. Dareadlink
eine eigene neue Zeile hinzugefügt wird (die normalerweise in der Befehlsersetzung verwendet wird, wenn nicht für unsere vorherigen Tricks), müssen wir auch diese entfernen. Dies lässt sich am einfachsten mit dem$''
Anführungszeichen erreichen, mit dem Escape-Sequenzen wie z\n
um Zeilenumbrüche darzustellen (auf diese Weise können Sie auch leicht falsch benannte Verzeichnisse und Dateien erstellen).Das Obige sollte Ihre Anforderungen zum Auffinden des aktuell ausgeführten Skripts unter Linux abdecken. Wenn Sie jedoch nicht über das
proc
Dateisystem verfügen oder versuchen, den vollständig aufgelösten Pfad einer anderen Datei zu finden , werden Sie dies möglicherweise tun Finden Sie den folgenden Code hilfreich. Es ist nur eine geringfügige Änderung gegenüber dem obigen Einzeiler. Wenn Sie mit seltsamen Verzeichnis- / Dateinamen herumspielen, überprüfen Sie die Ausgabe mit beidenls
undreadlink
sind informativ, ebensols
wie "vereinfachte" Pfade, die beispielsweise?
Zeilenumbrüche ersetzen.quelle
/dev/pts/30
mit Bash auf Ubuntu 14.10 Desktop.echo $resolved
, ich rettete sie alsd
,chmod +x d
,./d
.#!/bin/bash
Versuchen Sie es mit:
quelle
$0
für${BASH_SOURCE[0]}
so dass diese Methode überall arbeiten, in einer Funktion einschließlich.dirname
da der letzte Teil von$0
möglicherweise ein Symlink ist, der auf eine Datei verweist, die sich nicht im selben Verzeichnis wie der Symlink selbst befindet. Die in dieser Antwort beschriebene Lösung erhält nur den Pfad des Verzeichnisses, in dem der Symlink gespeichert ist, und nicht das Verzeichnis des Ziels. Darüber hinaus fehlt dieser Lösung das Zitieren. Es funktioniert nicht, wenn der Pfad Sonderzeichen enthält.dir="$(realpath "$(dirname "${BASH_SOURCE[0]}")")"
Probieren Sie die folgende kreuzkompatible Lösung aus:
da die Befehle wie
realpath
oderreadlink
nicht verfügbar sein könnten (je nach Betriebssystem).Hinweis: In Bash wird empfohlen,
${BASH_SOURCE[0]}
anstelle von zu verwenden$0
, da sonst der Pfad bei der Beschaffung der Datei (source
/.
) unterbrochen werden kann .Alternativ können Sie die folgende Funktion in bash ausprobieren:
Diese Funktion benötigt 1 Argument. Wenn das Argument bereits einen absoluten Pfad hat, drucken Sie ihn so wie er ist, andernfalls drucken Sie das
$PWD
Argument Variable + Dateiname (ohne./
Präfix).Verbunden:
quelle
realpath
Funktion akzeptiert 1 Argument. Wenn das Argument bereits einen absoluten Pfad hat, drucken Sie ihn so wie er ist, andernfalls drucken Sie$PWD
+ Dateiname (ohne./
Präfix).Ich glaube, ich habe diesen. Ich bin zu spät zur Party, aber ich denke, einige werden es zu schätzen wissen, hier zu sein, wenn sie auf diesen Thread stoßen. Die Kommentare sollten erklären:
quelle
Dies sind kurze Möglichkeiten, um Skriptinformationen abzurufen:
Ordner und Dateien:
Verwenden Sie diese Befehle:
Und ich habe diese Ausgabe bekommen:
Siehe auch: https://pastebin.com/J8KjxrPF
quelle
Dies funktioniert in bash-3.2:
Wenn Sie ein
~/bin
Verzeichnis in Ihrem Verzeichnis haben$PATH
, befinden Sie sichA
in diesem Verzeichnis. Es bezieht das Skript~/bin/lib/B
. Sie wissen, wo sich das enthaltene Skript relativ zum ursprünglichen Skript imlib
Unterverzeichnis befindet, aber nicht, wo es sich relativ zum aktuellen Verzeichnis des Benutzers befindet.Dies wird durch Folgendes gelöst (innen
A
):Es spielt keine Rolle, wo sich der Benutzer befindet oder wie er das Skript aufruft, dies funktioniert immer.
quelle
which
ist sehr umstritten.type
,hash
Und andere builtins das Gleiche tun , was besser in bash.which
ist irgendwie tragbarer, obwohl es wirklich nicht dasselbe ist,which
das in anderen Shells wie tcsh verwendet wird, das es als eingebautes hat.which
Als externes Tool haben Sie keinen Grund zu der Annahme, dass es sich identisch mit der übergeordneten Shell verhält.Die aus meiner Sicht beste kompakte Lösung wäre:
Es gibt kein Vertrauen in etwas anderes als Bash. Die Verwendung von
dirname
,readlink
undbasename
wird schließlich zu Kompatibilitätsproblemen führen, so dass sie überhaupt möglich am besten vermieden werden , wenn.quelle
"$( cd "$( echo "${BASH_SOURCE[0]%/*}/" )"; pwd )"
. Sie hätten Probleme mit dem Stammverzeichnis, wenn Sie dies nicht tun. Auch warum musst du überhaupt Echo verwenden?dirname
undbasename
sind POSIX standardisiert? Warum sollten Sie sie nicht verwenden? Links :dirname
,basename