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/nulldespué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 $PWDtodaví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
$PWDse haría en segundo plano antes de la evaluación de las declaraciones de eco. Pero claramente, acceder a$PWDsigue 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/shdisponible en Solaris 10 y anteriores ycshshells derivados, dudo que muchos otros shells convencionales carecen de esa característica.$()