Estoy escribiendo un script 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.
myscript path/to/file
, espero que el script evalúe la ruta / a / file en relación con MI directorio actual, no el directorio en el que ocurre el script para ubicarlo. Además, ¿qué pasaría si se ejecutara un script conssh remotehost bash < ./myscript
las preguntas frecuentes de BASH?cd "${BASH_SOURCE%/*}" || exit
Respuestas:
fuente
$0
. En su script, puede esperar, por ejemplo,../../
referirse al directorio dos niveles por encima de la ubicación del script, pero este no es necesariamente el caso si hay enlaces simbólicos en juego../script
,.
es el directorio correcto, y cambiarlo.
también terminará en el mismo directorio dondescript
se encuentra, es decir, en el directorio de trabajo actual.bash script.sh
, el valor de$0
esscript.sh
. La única forma en que elcd
comando "funcionará" para usted es porque no le importan los comandos fallidos. Si tuviera que usarset -o errexit
(también conocido como:)set -e
para asegurarse de que su script no supere los comandos fallidos, esto NO funcionaría porquecd script.sh
es un error. La manera confiable [específica de bash] escd "$(dirname ${BASH_SOURCE[0]})"
Lo siguiente también funciona:
La sintaxis se describe a fondo en esta respuesta de StackOverflow.
fuente
bash script.sh
-$0
solo será el nombre del archivoPruebe las siguientes frases sencillas:
Para todos UNIX / OSX / Linux
Golpetazo
Nota: Se utiliza un guión doble (-) 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.
Nota: en Bash, use
${BASH_SOURCE[0]}
a favor de$0
, de lo contrario, la ruta puede romperse al obtenerla (source
/.
).Para Linux, Mac y otros * BSD:
Nota:
realpath
debe instalarse en la distribución Linux más popular de forma predeterminada (como Ubuntu), pero en algunos puede faltar, por lo que debe instalarla.Nota: Si está usando Bash, use
${BASH_SOURCE[0]}
a favor de$0
, de lo contrario, la ruta puede romperse al obtenerla (source
/.
).De lo contrario, podría intentar algo como eso (usará la primera herramienta existente):
Para Linux específico:
Usando GNU readlink en * BSD / Mac:
Nota: debe tener
coreutils
instalado (por ejemplo, 1. Instalar Homebrew , 2.brew install coreutils
).En bash
En bash puedes usar las expansiones de parámetros para lograr eso, como:
pero no funciona si el script se ejecuta desde el mismo directorio.
Alternativamente, puede definir la siguiente función en bash:
Esta función toma 1 argumento. Si el argumento ya tiene una ruta absoluta, imprímala como está; de lo contrario, imprima la
$PWD
variable + argumento del nombre de archivo (sin./
prefijo).o aquí está la versión tomada del
.bashrc
archivo Debian :Relacionado:
¿Cómo detectar el directorio actual en el que ejecuto mi script de shell?
Obtenga el directorio fuente de un script Bash desde el propio script
Bash script ruta absoluta con OS X
Manera confiable de que un script 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?
fuente
cp
comando, @kenorb?--
utiliza un guión doble ( ) en los comandos para indicar el final de las opciones de comando, de modo que los archivos que contienen guiones u otros caracteres especiales no rompan el comando. Intente, por ejemplo, crear el archivo a través detouch "-test"
ytouch -- -test
, luego elimine el archivo a través derm "-test"
yrm -- -test
, y vea la diferencia.realpath
paquete Debian está en desuso, no GNUrealpath
. Si cree que no está claro, puede sugerir una edición.Es fácil. Funciona.
fuente
cd "${BASH_SOURCE%/*}" || exit
La respuesta aceptada funciona bien para los scripts que no se han vinculado en otro lugar, como en
$PATH
.Sin embargo, si el script se ejecuta a través de un enlace simbólico,
Esto se cd en el
~/bin/
directorio y no en el~/project/
directorio, lo que probablemente romperá su secuencia de comandos si el propósito de estocd
es incluir dependencias relativas a~/project/
La respuesta segura de enlace simbólico está a continuación:
readlink -f
es necesario para resolver la ruta absoluta del archivo potencialmente enlazado.Las comillas son necesarias para admitir rutas de archivo que podrían contener espacios en blanco (mala práctica, pero no es seguro asumir que este no será el caso)
fuente
Este script parece funcionar para mí:
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 ejecute.
fuente
realpath
Es poco probable que se instale en todas partes. Lo que puede no importar, dependiendo de la situación del OP.realpath
pero tiene loreadlink
que parece ser similar.Obtén el camino real a tu guión
(Esta es la misma respuesta a mi pregunta aquí: obtener el nombre del directorio donde se ejecuta un script )
fuente
fuente
PWD es una variable de entorno.
fuente
Si solo necesita imprimir el directorio de trabajo actual, puede seguir esto.
Dar permiso de ejecución:
Luego ejecute el script para
./test
que pueda ver el directorio de trabajo actual.fuente
pwd
? Me parecen muchas pulsaciones de teclas desperdiciadas.