J'ai rencontré BASEDIR=$(pwd)
dans un script.
Y a-t-il des avantages ou des inconvénients par rapport à l'utilisation BASEDIR="$PWD"
, autres que peut-être, qui $PWD
pourraient être remplacés?
shell-script
pwd
Minix
la source
la source
$(pwd)
, car elle$PWD
peut devenir obsolète dans certaines circonstances.pwd
vous donneront potentiellement moins d’informations périmées que$PWD
dans certains cas.$(pwd)
en revanche, cela ne fonctionne pas si le répertoire en cours se termine par des caractères de nouvelle ligne, ce qui signifie qu’il faut bricoler un processus (sauf dans ksh93) et utiliser des ressources supplémentaires. Mon point de vue est l'utilisation$PWD
de$(pwd -P)
, ce n'est pas la peine d'utiliser$(pwd)
.cd -P -- "$dir"
. s'il y a le moindre doute sur la valeur de$PWD
vous, vous pouvez toujours d'cd -P .
abord. cela peut également être bénéfique dans la mesure où vous obtenez également ce qui$PWD
était auparavant$OLDPWD
et que vous pouvez donc les comparer par la suite - et lacd ...; cd -
séquence suivante ne manquera pas de vous ramener à votre situation actuelle.Réponses:
Si bash rencontre
$(pwd)
il exécutera la commande pwd et le 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 le$()
construction, ce qui, selon mon expérience, est assez souvent le cas. Donc, je voudrais utiliser$PWD
.Comme chaque nerd, j'ai mon propre tutoriel de script shell
la source
`command`
syntaxe n'était pas souhaitable et$(command)
qu'il fallait la préférer. Pour autant que je sache, ce dernier est conforme à POSIX, mais je ne suis pas sûr à 100%.$()
est en effet spécifié par POSIX. Par conséquent, en dehors du pré-POSIX/bin/sh
disponible sur Solaris 10 et lescsh
shell plus anciens et dérivés, je doute que de nombreux autres shell classiques ne disposent pas de cette fonctionnalité.$()
Il convient également de mentionner que cela
$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 inspectezman 1 bulitin
un système avec Bash, vous verrez quepwd
c'est une commande intégrée, ce qui peut vous amener à 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:Je reçois 1,52 seconde pour l’
$(pwd)
appel et 0,018 seconde pour$PWD
. Le lancement inutile de sous-réservoirs, ainsi que tout autre processus inutile, doit être évité autant que possible. Ils sont beaucoup plus coûteux que les appels de fonctions auxquels vous pourriez être habitué dans d'autres langues.la source
echo $PWD; pushd ..; echo $PWD; popd
(avec supplémentaire>/dev/null
après chaque instruction), et cela prend 0,05 seconde. J'ai ensuite supprimé les instructions echo (uniquement pushd / popd) et il a fallu 0,03. Donc, le tempsecho $PWD
était encore d'environ 0,01 seconde. J'ai fait quelque chose de similaire avec$(pwd)
, et cela a pris 2,2 secondes pour chaque boucle, donc 1,1 seconde par$(pwd)
appel.$PWD
serait effectué en tâche de fond avant l'évaluation des déclarations d'écho. Mais il est clair que l’accès$PWD
est toujours beaucoup plus rapide, donc si la compatibilité n’est pas un problème, c’est une bonne raison de choisir l’un sur l’autre. Merci pour le travail en testant cela si bien. :)