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

35

Me encontré BASEDIR=$(pwd)en un guión.

¿Hay alguna ventaja o desventaja sobre el uso BASEDIR="$PWD", aparte de tal vez, que $PWDpodría sobrescribirse?

Minix
fuente
3
alguna información en unix.stackexchange.com/a/79621
Stéphane Chazelas
@ StéphaneChazelas Muy interesante escribir. Estoy a mitad de camino y continuaré, pero hasta donde lo entiendo, es mejor usarlo $(pwd), porque $PWDpuede quedar desactualizado en ciertas circunstancias.
Minix
2
solo en algunos shells (no bash, dash, zsh o ksh93, por ejemplo) pwdpotencialmente le dará menos información obsoleta que $PWDen algunos casos de esquina. $(pwd)por otro lado, no funciona si el directorio actual termina en caracteres de nueva línea, significa bifurcar un proceso (excepto en ksh93) y usar recursos adicionales. Mi punto de vista es el uso $PWDde $(pwd -P), no es digno de usar $(pwd).
Stéphane Chazelas
1
en la parte inferior, stephane menciona el uso cd -P -- "$dir". Si hay alguna duda sobre el valor de $PWDusted siempre puede cd -P .primero. Esto también puede ser beneficioso ya que también obtienes lo que $PWDera antes $OLDPWDy luego puedes compararlos después, y la próxima cd ...; cd -secuencia seguramente te llevará de regreso a donde estás ahora.
mikeserv

Respuestas:

41

Si bash se encuentra $(pwd), ejecutará el comando pwd y lo reemplazará $(pwd)con la salida de este comando. $PWDes una variable que casi siempre se establece. pwd es un comando de shell incorporado desde hace mucho tiempo.

Por $PWDlo tanto , fallará si esta variable no se establece y $(pwd)fallará si está utilizando un shell que no admite la $()construcción, que, según mi experiencia, es el caso con bastante frecuencia. Entonces lo usaría $PWD.

Como todos los nerds, tengo mi propio tutorial de scripting de shell

Thorsten Staerk
fuente
66
Tenía la impresión de que la `command`sintaxis no era deseable y $(command)es preferible. Hasta donde sé, este último es compatible con POSIX, pero no estoy 100% seguro.
Minix
66
@Minix The $()está especificado por POSIX, por lo que, fuera del POSIX previo /bin/shdisponible en Solaris 10 y cshshells anteriores y derivados, dudo que muchos otros shells convencionales carezcan de esa característica.
jlliagre
@Minix: Aquí hay una pregunta reciente en este sitio que ilustra un problema con el uso de backticks en lugar de$()
PM 2Ring
correcto, en lugar de $ () podrías usar backticks, pero esto no será en cascada, así que no lo mencioné
Thorsten Staerk
1
Buen minimapa en tu tutorial ...
kbtzr
6

También debe mencionarse que $PWDes deseable debido a su rendimiento. Como variable de shell, se puede resolver casi al instante. $(pwd)Es un poco más confuso. Si inspecciona man 1 bulitinun sistema con Bash, verá que pwdes un comando incorporado, que puede llevarlo a creer que será tan rápido como acceder a una variable. Sin embargo, la $()construcción siempre lanza una nueva subshell (un nuevo proceso) para ejecutar su contenido, independientemente de lo que haya dentro. Lo mismo ocurre con los backticks. 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)

Tengo 1.52 segundos para la $(pwd)llamada y 0.018 segundos para $PWD. Se debe evitar el lanzamiento innecesario de subcapas, así como cualquier otro proceso extraño, siempre que sea posible. Son mucho más caros que las llamadas a funciones a las que puede estar acostumbrado en otros idiomas.

markasoftware
fuente
Es una versión interesante, pero no sé si me preocupa el rendimiento de mis scripts de shell. También me pregunto cómo cambiaría el rendimiento, si el pwd cambia entre consultas.
Minix
@Minix Modifiqué mi script para que el cuerpo del bucle sea echo $PWD; pushd ..; echo $PWD; popd(con adicional >/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 lo tanto, el tiempo por echo $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.
markasoftware
No es que sea demasiado exigente, pero me imagino que el cálculo, que reemplazaría $PWD, se realizaría en segundo plano antes de la evaluación de las declaraciones de eco. Pero claramente, el acceso $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 una sobre la otra. Gracias por el trabajo en probar esto tan a fondo. :)
Minix