¿Qué genera pwd?

¿Qué genera pwd?

¿El comando pwden un script de shell genera el directorio en el que se encuentra el script de shell?

Respuesta1

Aquí hay tres "directorios" independientes en juego:

  1. el directorio de trabajo actual de su shell actual,
  2. el directorio de trabajo actual del script de shell, y
  3. 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 pwdera "/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, pwdes 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:

  1. Su ubicación en la estructura del directorio cuando llama a un script o binario.
  2. 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 dirnameutilidad 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 $0generalmente contiene el nombre de ruta utilizado para invocar el script que se está ejecutando y la expansión del shell usa la dirnameutilidad 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 readlinkobtener realpathuna 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 $0es suficiente para decirle lo que desea saber. Si está haciendo algo lo suficientemente complicado como para $0no 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

pwddevuelve 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

información relacionada