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
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/shdisponible sur Solaris 10 et plus ancien etcshshells 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/nullaprè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 parecho $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
$PWDse ferait en arrière-plan avant lévaluation des déclarations décho. Mais clairement, accéder à$PWDest 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. 🙂
$(pwd), car$PWDpeut devenir obsolète dans certaines circonstances.pwdvous donnera potentiellement moins dinformations périmées que$PWDdans 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$PWDde$(pwd -P), il ' ne vaut pas la peine dutiliser$(pwd).cd -P -- "$dir". en cas de doute sur la valeur de$PWD, vous pouvez toujourscd -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$OLDPWDet vous pouvez donc les comparer par la suite – et le suivantcd ...; cd -la séquence ne manquera pas de vous ramener là où vous êtes maintenant.