¿Es mejor usar $ (pwd) o $ PWD?

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

  • algo de información en unix.stackexchange.com/a/79621
  • @St é phaneChazelas Escrito muy interesante. Yo ' solo estoy a la mitad y continuaré, pero por lo que tengo entendido, es ' mejor usar $(pwd), porque $PWD puede quedar desactualizado en determinadas circunstancias.
  • solo en algunos shells (no bash, dash, zsh o ksh93 para instancia) 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).
  • en la parte inferior, stephane menciona el uso de 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

    • Tenía la impresión de que la `command` sintaxis no era deseable y $(command) es preferible. Hasta donde yo sé, este último es compatible con POSIX, pero ' no estoy 100% seguro.
    • @Minix El $() es de hecho especificado por POSIX, por lo que fuera del pre POSIX /bin/sh disponible en Solaris 10 y anteriores y csh shells derivados, dudo que muchos otros shells convencionales carecen de esa característica.
    • @Minix: Aquí hay una pregunta reciente en este sitio que ilustra un problema con el uso de comillas invertidas en lugar de $()
    • correcto, en lugar de $ () puede usar comillas invertidas, pero esto no se puede conectar en cascada, así que no lo mencioné
    • Buen minimapa en tu tutorial ….

    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 por echo $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. 🙂

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *