Pourquoi pwd n'accepte pas les options longues comme --physical?

11

Lorsque j'affiche le manuel de la pwdcommande, il indique que les options longues comme --physicalsont prises en charge

$ man pwd
PWD(1)                           User Commands                          PWD(1)

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

Cependant, il échoue lorsque je tape ce qui suit

$ pwd --physical
-bash: pwd: --: invalid option
pwd: usage: pwd [-LP]

Pourquoi les options longues ne fonctionnent-elles pas pour moi?

J'utilise RHEL 6.4. Aucun alias pour pwd n'est configuré. On dirait que c'est la traction avant standard:

$ which pwd
/bin/pwd
Michal Kordas
la source
1
La page de manuel est destinée à un utilitaire autonome qui ne fait pas partie de bash.
Thomas Dickey
7
Utilisez typeau lieu de which, car whichne montre que les commandes, tandis que les typemots clés, les commandes intégrées, les alias, les fonctions et les commandes (et les chemins de commande hachés). Pour plus de détails, voir Pourquoi ne pas utiliser «lequel»? Que faut-il utiliser alors?
wjandrea
1
Dans mon système man pwda la note suivante: your shell may have its own version of pwd, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supportsau bas de la DESCRIPTIONsection.
Nykakin

Réponses:

26

basha une commande intégrée pwdqui est ce que vous utilisez lorsque vous tapez simplement pwddans votre shell.

Pour obtenir le pwdcomme décrit par la page de manuel, vous devez forcer l'utilisation de la commande externe. Vous pouvez le faire en spécifiant le chemin d'accès complet à l'exécutable ( /bin/pwddans votre cas) ou en ajoutant envavant la ligne :, env pwdqui démarre la envcommande qui peut être utilisée pour ajouter des paramètres à l'environnement (mais qui ne se fait pas ici), puis envdémarre la commande spécifiée. Comme il envn'a pas de fonction intégrée pwd, le "vrai" /bin/pwdest exécuté.

L'avantage du pwdbash intégré est qu'il bashgarde la trace du répertoire actuel, donc obtenir la valeur est à un coût nul, tandis que la commande externe doit rechercher à travers le système de fichiers pour déterminer le chemin, ce qui est beaucoup plus intensif en E / S.

gémir
la source
4
Ce n'est pas ainsi que la commande externe fonctionne réellement. unix.stackexchange.com/a/413225/5132
JdeBP
BTW: Vous pouvez également désactiver le shell intégré (au moins en bash) parenable -n pwd
derobert
@JdeBP C'était la dernière fois que je regardais (il y a longtemps :-)); et alors qu'il utilise maintenant l' getcwd()appel système, le noyau traverse toujours le système de fichiers, ce qui est plus facile à faire dans l'espace du noyau en raison de l'accès aux structures de données pertinentes, comme l'indique la réponse liée: "Cependant, notez que même sur FreeBSD et les autres systèmes, le noyau ne garde pas la trace du répertoire de travail avec une chaîne. "
wurtel
11

Cette page de manuel documente /bin/pwd, mais lorsque vous exécutez, pwdvous utilisez le shell intégré; voir la sortie de

type pwd

La fonction intégrée de votre shell pwdne prend pas en charge les options longues (consultez la documentation de votre shell; puisque vous utilisez Bash, vous en help pwdtrouverez un résumé).

Stephen Kitt
la source