2009-03-10 11 views

Antwort

123

Für den relativen Pfad (dh das direkte Äquivalent von Windows' %~dp0):

MY_PATH="`dirname \"$0\"`" 
echo "$MY_PATH" 

Für die absolute normalisierte Pfad:

MY_PATH="`dirname \"$0\"`"    # relative 
MY_PATH="`(cd \"$MY_PATH\" && pwd)`" # absolutized and normalized 
if [ -z "$MY_PATH" ] ; then 
    # error; for some reason, the path is not accessible 
    # to the script (e.g. permissions re-evaled after suid) 
    exit 1 # fail 
fi 
echo "$MY_PATH" 
+0

funktioniert nicht auf meinem Mac Bash. –

+0

Was ist das Problem auf Ihrem Mac Bash? funktioniert gut hier auf Cygwin, Linux, Solaris, etc., und es muss auch auf Mac funktionieren – vladr

+0

es gibt nur den relativen Pfad –

16

Angenommen, Sie zu der Bash in den vollständigen Pfad eingeben Skript, verwenden $0 und dirname, zB:

#!/bin/bash 
echo "$0" 
dirname "$0" 

Ex reichlicher Ausgang:

$ /a/b/c/myScript.bash 
/a/b/c/myScript.bash 
/a/b/c 

Falls notwendig, die Ergebnisse des $PWD Variable auf einen relativen Pfad anhänge.

EDIT: Anführungszeichen hinzugefügt, um Leerzeichen zu behandeln.

+0

@Rothko, schlägt Ihre Lösung fehl, wenn $ 0 Leerzeichen enthält. – vladr

+1

Innerhalb der Bash können Sie auch '$ BASH_SOURCE' verwenden. Von [diesem Beitrag] (http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in). – JamesThomasMoon1979

7

Bereitgestellt von Stephane CHAZELAS auf c.u.s. Unter der Annahme, POSIX-Shell:

prg=$0 
if [ ! -e "$prg" ]; then 
    case $prg in 
    (*/*) exit 1;; 
    (*) prg=$(command -v -- "$prg") || exit;; 
    esac 
fi 
dir=$(
    cd -P -- "$(dirname -- "$prg")" && pwd -P 
) || exit 
prg=$dir/$(basename -- "$prg") || exit 

printf '%s\n' "$prg" 
+0

brilliant funktioniert für mich auf Mac OSX die anderen Ansätze in dieser Frage nicht. – ams

+0

+1 für den Umgang mit Script-Aufruf über '$ PATH' Suche; Das obige ** ist jedoch NICHT POSIX **. Es funktioniert nur mit 'bash'. Verwenden Sie 'which' anstelle von' command' und backticks anstelle von '$ (...)', das muss unter anderen, älteren Shells laufen. – vladr

+6

Hi @vladr, der obige Code ist POSIX! Wenn ich es richtig verstehe, meinen Sie, dass der Code nicht mit der alten Bourne-Shell (/ bin/sh unter Solaris <11) läuft, aber das hat nichts mit POSIX zu tun. –

1

Vlads Code overquoted wird. Sollte sein:

MY_PATH=`dirname "$0"` 
MY_PATH=`(cd "$MY_PATH" && pwd)` 
+0

Ihre zweite Zeile enthält ein zusätzliches Anführungszeichen. –

3
echo Running from `dirname $0` 
+2

'$ 0' sollte escaped sein (' dirname "$ 0" ') – fnkr

Verwandte Themen