web-dev-qa-db-fra.com

Est-il préférable d'utiliser $ (pwd) ou $ PWD?

J'ai rencontré BASEDIR=$(pwd) dans un script.

Y a-t-il des avantages ou des inconvénients à utiliser BASEDIR="$PWD", à part peut-être que $PWD pourrait être écrasé?

44
Minix

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 n'est pas définie et $(pwd) échouera si vous utilisez un Shell qui ne supporte pas la construction $() ce qui, à mon expérience, est assez souvent le cas. J'utiliserais donc $PWD.

Comme chaque nerd, j'ai le mien Tutoriel de script Shell

48
Thorsten Staerk

Il convient également de mentionner que $PWD Est souhaitable en raison de ses performances. En tant que variable Shell, elle peut être résolue 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, ce qui peut vous faire croire qu'elle 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, quand 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)

J'obtiens 1,52 seconde pour l'appel $(pwd) et 0,018 seconde pour $PWD. Le lancement inutile de sous-coques, ainsi que tout autre processus étranger, doit être évité autant que possible. Ils sont beaucoup plus chers que les appels de fonction auxquels vous pouvez être habitué dans d'autres langues.

7
markasoftware