
¿El comando pwd
en un script de shell genera el directorio en el que se encuentra el script de shell?
Respuesta1
Aquí hay tres "directorios" independientes en juego:
- el directorio de trabajo actual de su shell actual,
- el directorio de trabajo actual del script de shell, y
- el directorio que contiene el script de shell.
Para demostrar que son independientes, puede escribir un script de shell, guardado en /tmp/pwd.sh, que contenga:
#!/bin/sh
pwd
cd /var
pwd
Luego puede cambiar su contraseña (#1 arriba) a /:
cd /
y ejecuta el script:
/tmp/pwd.sh
que comienza demostrando su contraseña existente (n.° 1), luego la cambia a /var y la muestra nuevamente (n.° 2). Ninguno de esos pwd
era "/tmp", el directorio que contiene /tmp/pwd.sh (#3).
Respuesta2
Directorio de trabajo actual (o actual)
¿El comando pwd en un script de shell devuelve el directorio en el que se encuentra el script de shell?
No.
En primer lugar, por definición, ningún script o comando de shell devuelve nada más que un estado de salida numérico entre 0 y 255. Eso es axiomático, pero generalmente no es lo que la gente quiere decir cuando hace este tipo de preguntas.
En segundo lugar, pwd
es a la vez unBourne shell incorporadoy un sistema binario estándar. Cualquiera de los doshuellas dactilareslo lógico o físicodirectorio de trabajo actual, que generalmente es:
- Su ubicación en la estructura del directorio cuando llama a un script o binario.
- Su ubicación actual después de cambiar el directorio de trabajo concdu otras utilidades e incorporaciones que modifican el directorio de trabajo actual, como pushd o popd.
Si desea el directorio del script actual, utilice la dirname
utilidad como se describe en la sección final a continuación.
Prueba rápida depwd
Como prueba rápida para ver quépersona con discapacidadrealmente imprime, puedes ejecutar lo siguiente:
# Create a shell script containing pwd.
cat <<-EOF > /tmp/test_pwd.sh
#!/bin/sh
pwd
EOF
# Make the script executable.
chmod 755 /tmp/test_pwd.sh
# Go somewhere on the filesystem, and call the test script.
cd /etc
/tmp/test_pwd.sh
Esto se imprimirá /etc
, no /tmp
, porque su directorio de trabajo actual es el actual /etc
. Este es el comportamiento esperado.
Obtener el directorio que contiene un script
Probablemente esté haciendo esta pregunta porque desea encontrar el directorio del script actual. En el caso general, la siguiente es la solución rápida y sucia:
#!/usr/bin/env bash
echo $(dirname "$0")
Esto funciona porque $0
generalmente contiene el nombre de ruta utilizado para invocar el script que se está ejecutando y la expansión del shell usa la dirname
utilidad para devolver la ruta excluyendo la parte del nombre de archivo. Puedes hacer algo similar, pero menos portátil, con la expansión de parámetros de Bash "${0%/*}"
.
Por supuesto, todo esto es una enorme simplificación excesiva. Por favor lea elmanual de bash(especialmente las secciones sobre parámetros posicionales, parámetros especiales yBASH_FUENTE) y las páginas de manual para readlink
obtener realpath
una comprensión más completa de cuáles son los casos extremos, de los cuales hay varios.
Sin embargo, en las secuencias de comandos del día a día, el componente de directorio de $0
es suficiente para decirle lo que desea saber. Si está haciendo algo lo suficientemente complicado como para $0
no contener la información que realmente necesita y necesita construcciones más complicadas como:
echo $(dirname "$(realpath "$0")")
entonces probablemente estás haciendo tu vida más difícil de lo necesario.
Respuesta3
pwd
devuelve 0 a menos que no se pueda abrir su directorio de trabajo actual.
mkdir /tmp/d; cd "$_"
pwd && pwd -P; echo "$?"
rmdir ../d
pwd && pwd -P; echo "$?"
/tmp/d
/tmp/d
0
/tmp/d
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
1
Respuesta4
¡Devuelve el directorio desde donde se llama/ejecuta y no donde está el script!
Aquí está try.sh:
echo "The current working directory: $PWD"
Este resultado dejará más claro:
[akarpe@ADM-PROD-OMNI ~]$ sh try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh try/try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh ./try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh ./try/try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ cd try
[akarpe@ADM-PROD-OMNI try]$ sh ./try.sh
The current working directory: /mnt/home/akarpe/try
[akarpe@ADM-PROD-OMNI try]$ sh ../try.sh
The current working directory: /mnt/home/akarpe/try