2009-03-10 29 views

Respuesta

123

Para la ruta relativa (es decir, el equivalente directo de %~dp0 de Windows'):

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

Para la ruta absoluta, normalizada:

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

no funciona en mi mac bash. –

+0

¿cuál es el problema en tu mac bash? funciona bien aquí en Cygwin, Linux, Solaris, etc., y también debe funcionar en mac – vladr

+0

, solo proporciona la ruta relativa aunque –

16

Suponiendo que escriba en la ruta completa a la fiesta guión, utilizar $0 y dirname, por ejemplo:

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

Ex amplio de salida:

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

Si es necesario, añadir los resultados de la variable $PWD a una ruta relativa.

EDITAR: Se han añadido comillas para manejar caracteres espaciales.

+0

@Rothko, su solución fallará si $ 0 contiene espacios en blanco. – vladr

+1

Dentro de bash también puede usar '$ BASH_SOURCE'. De [esta publicación] (http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in). – JamesThomasMoon1979

7

Contribuido por Stephane CHAZELAS en c.u.s. Suponiendo 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

brillante funciona para mí en Mac OSX, los otros enfoques en esta pregunta no. – ams

+0

+1 para tratar la invocación de scripts a través de la búsqueda '$ PATH'; sin embargo, lo anterior ** NO ES POSIX **. Solo funcionará con 'bash'. Use 'which' en lugar de' command' y backticks en lugar de '$ (...)' si esto tiene que ejecutarse bajo otros shells más antiguos. – vladr

+6

Hola @vladr, ¡el código de arriba es POSIX! Si entiendo correctamente, lo que quiere decir es que el código no se ejecutará con el antiguo shell de Bourne (/ bin/sh en Solaris <11 por ejemplo), pero eso no tiene nada que ver con POSIX. –

1

código de Vlad se overquoted. En caso de ser:

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

Su segunda línea tiene un carácter extra de comillas dobles. –

3
echo Running from `dirname $0` 
+2

'$ 0' debe ser escapado (' dirname "$ 0" ') – fnkr

Cuestiones relacionadas