Vaut-il mieux utiliser $ (pwd) ou $ PWD?

Jai rencontré BASEDIR=$(pwd) dans un script.

Y a-t-il des avantages ou des inconvénients par rapport à en utilisant BASEDIR="$PWD", autre que peut-être, que $PWD pourrait être écrasé?

Commentaires

  • quelques informations sur unix.stackexchange.com/a/79621
  • @St é phaneChazelas Rédaction très intéressante. Je ' m seulement à mi-chemin et je continuerai, mais pour autant que je lai compris, il est préférable ' dutiliser $(pwd), car $PWD peut devenir obsolète dans certaines circonstances.
  • uniquement dans certains shells (pas bash, dash, zsh ou ksh93 pour instance) pwd vous donnera potentiellement moins dinformations périmées que $PWD dans certains cas de coin. $(pwd) dautre part ne ' t fonctionne si le répertoire courant se termine par des caractères de nouvelle ligne, signifie bifurquer un processus (sauf dans ksh93) et utiliser des ressources supplémentaires. Mon point de vue utilise $PWD de $(pwd -P), il ' ne vaut pas la peine dutiliser $(pwd).
  • en bas, Stéphane mentionne en utilisant cd -P -- "$dir". en cas de doute sur la valeur de $PWD, vous pouvez toujours cd -P . en premier. cela peut également être bénéfique dans la mesure où vous obtenez également tout ce que $PWD était avant cela dans $OLDPWD et vous pouvez donc les comparer par la suite – et le suivant cd ...; cd - la séquence ne manquera pas de vous ramener là où vous êtes maintenant.

Réponse

Si bash rencontre $(pwd), il exécutera la commande pwd et remplacera $(pwd) par la sortie de cette commande. $PWD est une variable qui est presque toujours définie. pwd est une commande shell intégrée depuis longtemps.

Donc $PWD échouera si cette variable nest pas définie et $(pwd) échouera si vous utilisez un shell qui ne prend pas en charge la construction $() qui doit mon expérience est assez souvent le cas. Jutiliserais donc $PWD.

Comme chaque nerd, jai mon propre tutoriel sur les scripts shell

Comme nts

  • Javais limpression que la syntaxe `command` nétait pas souhaitable et $(command) doit être préféré. Autant que je sache, ce dernier est conforme POSIX, mais je ' ne suis pas sûr à 100%.
  • @Minix Le $() est en effet spécifié par POSIX donc en dehors du pré-POSIX /bin/sh disponible sur Solaris 10 et plus ancien et csh shells dérivés, je doute que beaucoup dautres shells grand public nont pas cette fonctionnalité.
  • @Minix: Voici une question récente sur ce site qui illustre un problème lié à lutilisation des backticks au lieu de $()
  • correct, au lieu de $ () vous pouvez utiliser des backticks, mais ce ne sera pas cascadable donc je ne lai pas mentionné
  • Jolie mini-carte sur votre tutoriel ….

Réponse

Il faut également mentionner que $PWD est souhaitable en raison de ses performances. En tant que variable shell, il peut être résolu presque instantanément. $(pwd) est un peu plus déroutant. Si vous inspectez man 1 bulitin sur un système avec Bash, vous « verrez que pwd est une commande intégrée, qui peut vous conduire à pense que ce sera aussi rapide que d’accéder à une variable. Cependant, la construction $() lance toujours un nouveau sous-shell (un nouveau processus) pour exécuter son contenu, quel que soit son contenu . La même chose vaut pour les backticks. En effet, lorsque je le compare:

echo "Benchmarking $(pwd)..." time (for i in {1..1000}; do echo $(pwd) > /dev/null; done) echo "Benchmarking $PWD..." time (for i in {1..1000}; do echo $PWD > /dev/null; done) 

Jobtiens 1,52 seconde pour lappel $(pwd) et 0,018 seconde pour $PWD. Le lancement inutile de sous-shell, ainsi que tout autre processus superflu, doivent être évités autant que possible. Ils « sont beaucoup plus chers que les appels de fonction auxquels vous êtes habitué dans dautres langues.

Commentaires

  • Que ' est une interprétation intéressante, mais je ne ' ne sais pas si je suis préoccupé par les performances de mes scripts shell. Je me demande aussi comment les performances changeraient si le pwd change entre linterrogation.
  • @Minix Jai modifié mon script pour que le corps de la boucle soit echo $PWD; pushd ..; echo $PWD; popd (avec >/dev/null après chaque instruction), et cela prend 0,05 secondes. Jai ensuite supprimé les instructions echo (uniquement pushd / popd) et cela a pris 0,03.Ainsi, le temps par echo $PWD était encore de 0,01 seconde environ. Jai fait quelque chose de similaire avec $(pwd), et cela a pris 2,2 secondes pour chaque boucle, donc 1,1 seconde par appel $(pwd).
  • Ne pas être trop pointilleux, mais je peux imaginer, que le calcul, qui remplacerait $PWD se ferait en arrière-plan avant lévaluation des déclarations décho. Mais clairement, accéder à $PWD est encore beaucoup plus rapide, donc si la compatibilité nest pas un problème, cest certainement une raison de choisir lun sur lautre. Merci pour le travail de test si minutieux. 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *