GNU/Linux >> Tutoriels Linux >  >> Linux

Que produit pwd ?

Il y a trois "répertoires" indépendants en jeu ici :

  1. le répertoire de travail actuel de votre shell actuel,
  2. le répertoire de travail actuel du script shell, et
  3. le répertoire contenant le script shell.

Pour démontrer qu'ils sont indépendants, vous pouvez écrire un script shell, enregistré dans /tmp/pwd.sh, contenant :

#!/bin/sh
pwd
cd /var 
pwd

Vous pouvez alors changer votre pwd (#1 ci-dessus) en /:

cd /

et exécutez le script :

/tmp/pwd.sh

qui commence par démontrer votre pwd existant (#1), puis le change en /var et l'affiche à nouveau (#2). Aucun de ces pwd étaient "/tmp", le répertoire qui contient /tmp/pwd.sh (#3).


Répertoire de travail actuel (ou actuel)

La commande pwd dans un script shell renvoie-t-elle le répertoire dans lequel se trouve le script shell ?

Non.

Premièrement, par définition, aucun script shell ou commande shell ne renvoie autre chose qu'un état de sortie numérique compris entre 0 et 255. C'est axiomatique, mais ce n'est généralement pas ce que les gens veulent dire lorsqu'ils posent ce type de questions.

Deuxièmement, pwd est à la fois un shell Bourne intégré et un binaire système standard. L'un ou l'autre imprime le répertoire de travail courant logique ou physique , qui est généralement :

  1. Votre emplacement dans la structure des répertoires lorsque vous appelez un script ou un binaire.
  2. Votre emplacement actuel après avoir changé le répertoire de travail avec cd ou d'autres utilitaires et fonctions intégrées qui modifient le répertoire de travail actuel, tels que pushd ou popd.

Si vous voulez le répertoire du script en cours, utilisez le dirname utilitaire tel que décrit dans la dernière section ci-dessous.

Test rapide de pwd

Comme un test rapide pour voir ce que pwd imprime vraiment, vous pouvez exécuter ce qui suit :

# 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

Cela imprimera /etc , pas /tmp , car votre répertoire de travail actuel est actuellement /etc . C'est le comportement attendu.

Obtenir le répertoire contenant un script

Vous posez probablement cette question parce que vous voulez trouver le répertoire du script en cours. Dans le cas général, voici la solution simple et rapide :

#!/usr/bin/env bash
echo $(dirname "$0")

Cela fonctionne car $0 contient généralement le chemin d'accès utilisé pour invoquer le script en cours d'exécution, et l'extension du shell utilise le dirname utilitaire pour renvoyer le chemin excluant la partie du nom de fichier. Vous pouvez faire quelque chose de similaire, mais moins portable, avec l'extension de paramètre Bash "${0%/*}" .

Tout cela est une vaste simplification excessive, bien sûr. Veuillez lire le manuel de Bash (en particulier les sections sur les paramètres de position, les paramètres spéciaux et BASH_SOURCE ) et les pages de manuel pour readlink et realpath pour mieux comprendre ce que sont les cas extrêmes, il en existe plusieurs.

Cependant, dans les scripts quotidiens, le composant de répertoire de $0 est suffisant pour vous dire ce que vous voulez savoir. Si vous faites quelque chose d'assez compliqué où $0 ne contient pas les informations dont vous avez réellement besoin, et vous avez besoin de constructions plus compliquées comme :

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

alors vous rendez probablement votre vie plus difficile qu'elle ne devrait l'être.


pwd renvoie 0 sauf si son répertoire de travail actuel ne peut pas être ouvert.

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. Que fait "lc_all=c" ?

  2. Différence étrange entre Pwd et /bin/pwd ?

  3. Qu'est-ce que c'est ?

  4. Que fait Exec 3 ?

  5. Que retourne malloc(0) ?

Pwd sans liens symboliques ?

Que signifie la sortie de Ps ?

Que signifie cette sortie de Xev ?

Qu'est-ce que Echo $ ? Faire??

Que renvoie la commande Ls -al .* ?

Que fait 'bash -c' ?