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/sh
disponible sur Solaris 10 et plus ancien etcsh
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 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
$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. 🙂
$(pwd)
, car$PWD
peut devenir obsolète dans certaines circonstances.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)
.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$OLDPWD
et 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.