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,

War es hilfreich?

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

zu lokalisieren

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})"
Versuchen

, 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top