GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué genera pwd?

Hay tres "directorios" independientes en juego aquí:

  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 pwd (#1 arriba) a /:

cd /

y ejecute el script:

/tmp/pwd.sh

que comienza demostrando su pwd existente (#1), luego lo cambia a /var y lo muestra nuevamente (#2). Ninguno de esos pwd eran "/tmp", el directorio que contiene /tmp/pwd.sh (#3).


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 un shell Bourne incorporado y un sistema binario estándar. Cualquiera imprime el directorio de trabajo actual lógico o físico , que generalmente es:

  1. Su ubicación en la estructura de directorios cuando llama a un script o binario.
  2. Tu ubicación actual después de cambiar el directorio de trabajo con cd u otras utilidades y funciones integradas que modifican el directorio de trabajo actual, como pushd o popd.

Si desea el directorio del script actual, use el dirname utilidad como se describe en la sección final a continuación.

Prueba rápida de pwd

Como prueba rápida para ver qué pwd realmente imprime, puede 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 imprimirá /etc , no /tmp , porque su directorio de trabajo actual es actualmente /etc . Este es el comportamiento esperado.

Obtención del 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 de shell usa el dirname utilidad para devolver la ruta excluyendo la parte del nombre de archivo. Puede hacer algo similar, pero menos portátil, con la expansión de parámetros de Bash "${0%/*}" .

Todo esto es una gran simplificación excesiva, por supuesto. Lea el manual de Bash (especialmente las secciones sobre parámetros posicionales, parámetros especiales y BASH_SOURCE ) y las páginas man para readlink y realpath para obtener una comprensión más completa de cuáles son los casos límite, 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 decirte lo que quieres saber. Si está haciendo algo lo suficientemente complicado donde $0 no contiene la información que realmente necesita y requiere construcciones más complicadas como:

echo $(dirname "$(realpath "$0")")

entonces probablemente estés haciendo tu vida más difícil de lo que debe ser.


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

Linux
  1. ¿Qué significa el tamaño de un directorio en la salida del comando 'ls -l'?

  2. Pwd sin enlaces simbólicos?

  3. ¿Qué significa en la salida de Ps?

  4. ¿Qué significa esta salida de Xev?

  5. ¿Qué hace Echo $? ¿¿Hacer??

¿Qué significa 'cd -'?

¿Qué significa opt (como en el directorio opt)? ¿Es una abreviatura?

¿Qué hace 'bash -c'?

¿Qué significa el símbolo de la tubería de Linux? ¿hacer?

¿Qué hace kill -- -0?

¿Qué significa el sufijo .d en Linux?