Encontré BASEDIR=$(pwd)
en un script.
¿Hay alguna ventaja o desventaja sobre usando BASEDIR="$PWD"
, aparte de tal vez, que $PWD
podría sobrescribirse?
Comentarios
$(pwd)
, porque $PWD
puede quedar desactualizado en determinadas circunstancias. pwd
potencialmente le dará menos información obsoleta que $PWD
en algunos casos de esquina. $(pwd)
por otro lado no ' t funciona si el directorio actual termina en caracteres de nueva línea, significa bifurcar un proceso (excepto en ksh93) y utilizar recursos adicionales. Mi opinión es usar $PWD
de $(pwd -P)
, ' no vale la pena usar $(pwd)
. cd -P -- "$dir"
. si hay alguna duda sobre el valor de $PWD
siempre puede cd -P .
primero. esto también puede ser beneficioso ya que también obtienes lo que sea $PWD
antes de eso en $OLDPWD
y así puedes compararlos después, y el siguiente cd ...; cd -
la secuencia seguramente lo llevará de regreso a donde está ahora. Respuesta
Si bash encuentra $(pwd)
, ejecutará el comando pwd y reemplazará $(pwd)
con la salida de este comando. $PWD
es una variable que casi siempre está configurada. pwd es un comando de shell incorporado desde hace mucho tiempo.
Entonces $PWD
fallará si esta variable no está configurada y $(pwd)
fallará si está usando un shell que no es compatible con la construcción $()
que debe mi experiencia suele ser el caso. Así que usaría $PWD
.
Como cada nerd, tengo mi propio tutorial de secuencias de comandos de shell
Comme nts
Respuesta
También se debe mencionar que $PWD
es deseable debido a su rendimiento. Como variable de shell, se puede resolver casi instantáneamente. $(pwd)
es un poco más confuso. Si inspecciona man 1 bulitin
en un sistema con Bash, «verá que pwd
es un comando integrado, que puede llevarlo a cree que será tan rápido como acceder a una variable. Sin embargo, la construcción $()
siempre lanza una nueva subcapa (un nuevo proceso) para ejecutar su contenido, independientemente de lo que esté dentro . Lo mismo ocurre con las comillas invertidas. De hecho, cuando lo comparo:
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)
obtengo 1,52 segundos para la llamada $(pwd)
y 0,018 segundos para $PWD
. Siempre que sea posible, debe evitarse el lanzamiento innecesario de subcapas, así como cualquier otro proceso extraño. Son mucho más caras que las llamadas a funciones a las que puede estar acostumbrado en otros idiomas.
Comentarios
- Eso ' es una versión interesante, pero ' no sé si estoy preocupado por el rendimiento de mis scripts de shell. También me pregunto cómo cambiaría el rendimiento, si el pwd cambia entre consultarlo.
- @Minix Modifiqué mi script para que el cuerpo del bucle sea
echo $PWD; pushd ..; echo $PWD; popd
(con>/dev/null
después de cada declaración), y toma 0.05 segundos. Luego eliminé las declaraciones de eco (solo pushd / popd) y tomó 0.03.Por tanto, el tiempo porecho $PWD
todavía era de 0,01 segundos más o menos. Hice algo similar con$(pwd)
, y tomó 2.2 segundos para cada ciclo, por lo que 1.1 segundos por$(pwd)
llamada. - No quiero ser demasiado exigente, pero puedo imaginar que el cálculo que reemplazaría a
$PWD
se haría en segundo plano antes de la evaluación de las declaraciones de eco. Pero claramente, acceder a$PWD
sigue siendo significativamente más rápido, por lo que si la compatibilidad no es una preocupación, esta es definitivamente una razón para elegir uno sobre el otro. Gracias por el trabajo de probar esto tan a fondo. 🙂
`command`
sintaxis no era deseable y$(command)
es preferible. Hasta donde yo sé, este último es compatible con POSIX, pero ' no estoy 100% seguro.$()
es de hecho especificado por POSIX, por lo que fuera del pre POSIX/bin/sh
disponible en Solaris 10 y anteriores ycsh
shells derivados, dudo que muchos otros shells convencionales carecen de esa característica.$()