Kann ich den absoluten Pfad zum aktuellen Skript in Kornshell bekommen?
Frage
Ist es möglich, den vollständigen Pfad zu dem Skript, um herauszufinden, die derzeit in Kornshell (KSH) ausgeführt wird?
d. wenn mein Skript in /opt/scripts/myscript.ksh
ist, kann ich programmatisch innerhalb dieses Skript /opt/scripts/myscript.ksh
entdecken?
Danke,
Lösung
Sie können verwendet werden:
## __SCRIPTNAME - name of the script without the path
##
typeset -r __SCRIPTNAME="${0##*/}"
## __SCRIPTDIR - path of the script (as entered by the user!)
##
__SCRIPTDIR="${0%/*}"
## __REAL_SCRIPTDIR - path of the script (real path, maybe a link)
##
__REAL_SCRIPTDIR=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
Andere Tipps
In der Korn-Shell, alle diese $ 0 Lösungen fehlschlagen, wenn Sie in dem Skript in Frage sind Sourcing. Der richtige Weg zu bekommen, was Sie wollen, ist $ _
verwenden,$ cat bar
echo dollar under is $_
echo dollar zero is $0
$ ./bar
dollar under is ./bar
dollar zero is ./bar
$ . ./bar
dollar under is bar
dollar zero is -ksh
Beachten Sie die letzte Zeile da? Verwenden Sie $ _. Zumindest in Korn. YMMV in bash, csh, et al ..
Wie das Skript aufgerufen wurde in der Variablen $ 0 gespeichert ist. Sie können readlink
verwenden die absoluten Dateinamen zu erhalten:
readlink -f "$0"
Nun, es dauerte eine Weile, aber dies ist so einfach, es schreit.
_SCRIPTDIR=$(cd $(dirname $0);echo $PWD)
, da die CD mit $ in dem erzeugten Shell arbeitet () es nicht das aktuelle Skript beeinflussen.
Die Variable $ RPATH enthält den relativen Pfad zu der realen Datei oder den tatsächlichen Pfad für eine echte Datei.
CURPATH=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
CURLOC=$CURPATH/`basename $0`
if [ `ls -dl $CURLOC |grep -c "^l" 2>/dev/null` -ne 0 ];then
ROFFSET=`ls -ld $CURLOC|cut -d ">" -f2 2>/dev/null`
RPATH=`ls -ld $CURLOC/$ROFFSET 2>/dev/null`
else
RPATH=$CURLOC
fi
echo $RPATH
Das ist, was ich getan habe:
if [[ $0 != "/"* ]]; then
DIR=`pwd`/`dirname $0`
else
DIR=`dirname $0`
fi
readlink -f
wäre das Beste, wenn es tragbar ist, weil es alle Links für beiden Verzeichnisse und Dateien gefunden aufgelöst wird.
Unter Mac OS X gibt es keinen readlink -f
(außer vielleicht über Macports), so können Sie nur readlink
verwendet das Ziel einer bestimmten symbolischen Link-Datei zu erhalten.
Die $(cd -P ... pwd -P)
Technik ist schön, aber funktioniert nur Links für Verzeichnisse, um das Skript, die zu lösen, funktioniert es nicht, wenn das Skript selbst ein symbolischer Link ist
Auch ein Fall, der nicht erwähnt wurde: wenn Sie einen Skript starten, indem Sie es als Argument an eine Schale (/bin/sh /path/to/myscript.sh
) vorbei, $0
ist in diesem Fall nicht anwendbar
habe ich einen Blick auf MySQL „Binaries“, viele von ihnen sind tatsächlich Skripte Shell; und jetzt verstehe ich, warum sie für eine --basedir
Option fragen oder muß von einem bestimmten Arbeitsverzeichnis gestartet werden; dies liegt daran, dass es keine gute Lösung ist die gezielte Skript
Das funktioniert auch, obwohl es nicht dem „wahren“ Weg geben, wenn es eine Verbindung ist. Es ist einfacher, aber weniger genau.
SCRIPT_PATH="$(whence ${0})"
, welcher Befehl.
which scriptname
geben Sie den vollständigen qualifizierten Namen des Skripts zusammen mit seiner absoluten Pfad
verbessern ich die Antwort des Edward Staudt, die Lage sein, mit absolutem Pfad symbolischen Links zu beschäftigen, und mit Ketten von Links zu.
DZERO=$0
while true; do
echo "Trying to find real dir for script $DZERO"
CPATH=$( cd -P -- "$(dirname -- "$(command -v -- "$DZERO")")" && pwd -P )
CFILE=$CPATH/`basename $DZERO`
if [ `ls -dl $CFILE | grep -c "^l" 2>/dev/null` -eq 0 ];then
break
fi
LNKTO=`ls -ld $CFILE | cut -d ">" -f2 | tr -d " " 2>/dev/null`
DZERO=`cd $CPATH ; command -v $LNKTO`
done
Hässlich, aber funktioniert ... dieser nach dem Hochlauf ist der Pfad $ cPath und die Datei $ CFILE
$ _ Mit liefert den letzten Befehl.
>source my_script
funktioniert, wenn ich den Befehl zweimal ausgeben:
>source my_script
>source my_script
Wenn ich eine andere Befehlsfolge:
>who
>source my_script
Die Variable $ _ returns "die"
Versuchen Sie dies mit:
dir = $(dirname $0)