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 .
Obtén el camino real a tu guión
if [ -L $0 ] ; then
ME=$(readlink $0)
else
ME=$0
fi
DIR=$(dirname $ME)
(Esta es la respuesta a la misma pregunta que tengo aquí: Obtenga el nombre del directorio donde se ejecuta un script )
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:
¿Cómo detectar el directorio actual en el que ejecuto mi script de shell?
Obtener el directorio de origen de un script Bash desde dentro
¿Una forma confiable de que un script de bash obtenga la ruta completa a sí mismo?
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.