it-swarm.com.de

Kann ich den absoluten Pfad zum aktuellen Skript in KornShell abrufen?

Ist es möglich, den vollständigen Pfad zu dem Skript zu ermitteln, das derzeit in KornShell (ksh) ausgeführt wird?

d. h., wenn sich mein Skript in /opt/scripts/myscript.ksh befindet, kann ich in diesem Skript programmgesteuert /opt/scripts/myscript.ksh erkennen?

Vielen Dank,

21
brabster

Du könntest benutzen:

## __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 )
27
Marnix

In korn Shell schlagen alle diese $ 0-Lösungen fehl, wenn Sie in dem fraglichen Skript suchen. Der richtige Weg, um zu bekommen, was Sie wollen, ist $ _.

$ 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 dort? Verwenden Sie $ _. Zumindest in Korn. YMMV in bash, csh, et al.

9
user2639142

Nun, es hat eine Weile gedauert, aber dieses hier ist so einfach, dass es schreit.

_SCRIPTDIR=$(cd $(dirname $0);echo $PWD)

da die CD in der erzeugten Shell mit $ () arbeitet, hat sie keinen Einfluss auf das aktuelle Skript.

8
Mitch Brown

Wie das Skript aufgerufen wurde, wird in der Variablen $ 0 gespeichert. Sie können readlink verwenden, um den absoluten Dateinamen abzurufen:

readlink -f "$0"
7
soulmerge

Die Variable $ RPATH enthält den relativen Pfad zur realen Datei oder den realen 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
4
Edward Staudt

readlink -f wäre der beste, wenn es portabel wäre, da es alle gefundenen Links für Verzeichnisse und Dateien auflöst.

Auf Mac os x gibt es keinen readlink -f (außer vielleicht über macports). Sie können also nur readlink verwenden, um das Ziel einer bestimmten symbolischen Link-Datei abzurufen.

Die $(cd -P ... pwd -P)-Technik ist Nizza, funktioniert jedoch nur zum Auflösen von Links für Verzeichnisse, die zum Skript führen. Es funktioniert nicht, wenn das Skript selbst ein Symlink ist

Ein Fall, der nicht erwähnt wurde: Wenn Sie ein Skript starten, indem Sie es als Argument an eine Shell (/bin/sh /path/to/myscript.sh) übergeben, kann $0 in diesem Fall nicht verwendet werden

Ich habe mir mysql "binaries" angesehen, viele von ihnen sind eigentlich Shell-Skripte. und jetzt verstehe ich, warum sie nach einer --basedir-Option fragen oder von einem bestimmten Arbeitsverzeichnis aus gestartet werden müssen; Dies liegt daran, dass es keine gute Lösung gibt, um das Zielskript zu finden

2
Gruik

Das habe ich gemacht:

if [[ $0 != "/"* ]]; then
  DIR=`pwd`/`dirname $0`
else
  DIR=`dirname $0`
fi
2
John Nilsson

Dies funktioniert auch, obwohl es nicht den "wahren" Pfad gibt, wenn es sich um einen Link handelt. Es ist einfacher, aber weniger genau.

SCRIPT_PATH="$(whence ${0})"
1
mtruesdell

Versuchen Sie den Befehl.

which scriptname

gibt Ihnen den vollständigen qualifizierten Namen des Skripts zusammen mit seinem absoluten Pfad

1

Ich habe die Antwort von Edward Staudt verbessert, um mit symbolischen Links mit absoluten Pfaden umgehen zu können, und auch mit Linkketten.

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 ... Nach dem Ausführen ist der Pfad $ CPATH und die Datei ist $ CFILE

0
Maciel

Die Verwendung von $ _ liefert den letzten Befehl.

>source my_script

Funktioniert, wenn ich den Befehl zweimal ausstelle:

>source my_script
>source my_script

Wenn ich eine andere Reihenfolge von Befehlen verwende:

>who
>source my_script

Die Variable $ _ gibt "who" zurück

0
user5948557