script programas pasar parametros funciones ejemplos ejecutar directorio con cambiar bash path scripting

bash - programas - ¿Cómo configurar el directorio de trabajo actual al directorio del script?



pasar parametros shell script (10)

Este script parece funcionar para mí:

#!/bin/bash mypath=`realpath $0` cd `dirname $mypath` pwd

La línea de comando pwd hace eco de la ubicación del script como el directorio de trabajo actual, sin importar desde dónde lo ejecuté.

Estoy escribiendo un guión de bash. Necesito que el directorio de trabajo actual sea siempre el directorio en el que se encuentra el script.

El comportamiento predeterminado es que el directorio de trabajo actual en el script es el del shell desde el que lo ejecuto, pero no quiero este comportamiento.


La respuesta aceptada funciona bien para los scripts que no han sido vinculados simbólicamente en otros lugares, como en $PATH .

#!/bin/bash cd "$(dirname "$0")"

Sin embargo, si el script se ejecuta a través de un enlace simbólico,

ln -sv ~/project/script.sh ~/bin/; ~/bin/script.sh

Esto ingresará en el directorio ~/bin/ y no en el directorio ~/project/ , que probablemente romperá su script si el propósito del cd es incluir dependencias relativas a ~/project/

La respuesta segura del enlace simbólico es a continuación:

#!/bin/bash cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"

readlink -f es necesario para resolver la ruta absoluta del archivo potencialmente simbólico.

Las citas son necesarias para admitir rutas de archivo que podrían contener espacios en blanco (mala práctica, pero no es seguro asumir que no será así)


Lo siguiente también funciona:

cd "${0%/*}"

La sintaxis se describe detalladamente en this respuesta de .



Pruebe los siguientes sencillos de una sola línea:

Para todo UNIX / OSX / Linux

dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)

Nota: Un guión doble (-) se usa en los comandos para indicar el final de las opciones del comando, por lo que los archivos que contienen guiones u otros caracteres especiales no romperán el comando.

Para Linux, Mac y otros * BSD:

cd $(dirname $(realpath $0))

Con espacios en blanco soporte:

cd "$(dirname "$(realpath "$0")")";

Nota: realpath debe instalarse en la distribución de Linux más popular por defecto (como Ubuntu), pero en algunas puede faltar, por lo que debe instalarlo.

De lo contrario, podrías probar algo así (usará la primera herramienta existente):

cd $(dirname $(readlink -f $0 || realpath $0))

Para Linux específico:

cd $(dirname $(readlink -f $0))

Usando GNU readlink en * BSD / Mac:

cd $(dirname $(greadlink -f $0))

Nota: debe tener coreutils instalados (por ejemplo, 1. Instale Homebrew , 2. brew install coreutils ).

En bash

En bash puedes usar Expansiones de parámetros para lograr eso, como:

cd ${0%/*}

pero no funciona si el script se ejecuta desde el mismo directorio.

Alternativamente, puedes definir la siguiente función en bash:

realpath () { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" }

Esta función toma 1 argumento. Si el argumento ya tiene una ruta absoluta, imprímalo tal como está, de lo contrario imprima la variable $PWD + argumento de nombre de archivo (sin ./ prefijo).

o aquí está la versión tomada del archivo .bashrc Debian:

function realpath() { f=$@ if [ -d "$f" ]; then base="" dir="$f" else base="/$(basename "$f")" dir=$(dirname "$f") fi dir=$(cd "$dir" && /bin/pwd) echo "$dir$base" }

Relacionado:

Ver también:

¿Cómo puedo obtener el comportamiento de readlink -f de GNU en una Mac?


Si solo necesita imprimir el directorio de trabajo actual, puede seguir esto.

$ vim test #!/bin/bash pwd :wq to save the test file.

Dar permiso de ejecución:

chmod u+x test

Luego, ejecute el script mediante ./test luego podrá ver el directorio de trabajo actual.


#!/bin/bash cd "$(dirname "$0")"


cd "$(dirname ${BASH_SOURCE[0]})"

Es fácil. Funciona.


cd "`dirname $(readlink -f ${0})`"


echo $PWD

PWD es una variable de entorno.