2009-03-10 17 views

risposta

123

Per il percorso relativo (cioè l'equivalente diretto di %~dp0 Windows'):

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

Per il, percorso normalizzata assoluto:

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

non funziona sul mio mac bash. –

+0

qual è il problema sul tuo Mac Bash? funziona bene qui su Cygwin, Linux, Solaris, ecc., e deve funzionare anche su mac – vladr

+0

ma fornisce solo il percorso relativo se –

16

Supponendo che si digita il percorso completo della bash script, utilizzare $0 e dirname, ad esempio:

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

Ex ampia uscita:

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

Se necessario, aggiungere i risultati della variabile $PWD ad un relativo percorso.

MODIFICA: aggiunte virgolette per gestire i caratteri dello spazio.

+0

@Rothko, la tua soluzione fallirà se $ 0 contiene spazi vuoti. – vladr

+1

In bash puoi anche usare '$ BASH_SOURCE'. Da [questo post] (http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in). – JamesThomasMoon1979

7

Contribuito da Stephane CHAZELAS su c.u.s. Assumendo shell POSIX:

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

funziona brillantemente per me su Mac OSX ma gli altri approcci in questa domanda no. – ams

+0

+1 per gestire l'invocazione di uno script tramite la ricerca '$ PATH'; tuttavia, quanto sopra ** NON è POSIX **. Funzionerà solo con 'bash'. Usa 'which' invece di' command' e backticks invece di '$ (...)' questo deve essere eseguito con altre shell più vecchie. – vladr

+6

Ciao @vladr, il codice sopra è POSIX! Se ho capito bene, quello che intendi è che il codice non verrà eseguito con la vecchia shell Bourne (/ bin/sh su Solaris <11 per esempio), ma ciò non ha nulla a che fare con POSIX. –

1

codice di Vlad viene overquoted. Dovrebbe essere:

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

La seconda riga ha un carattere con doppia virgoletta aggiuntiva. –

3
echo Running from `dirname $0` 
+2

'$ 0' deve essere escapato (' dirname "$ 0" ') – fnkr

Problemi correlati