Me encontré BASEDIR=$(pwd)
en un guión.
¿Hay alguna ventaja o desventaja sobre el uso BASEDIR="$PWD"
, aparte de tal vez, que $PWD
podría sobrescribirse?
shell-script
pwd
Minix
fuente
fuente
$(pwd)
, porque$PWD
puede quedar desactualizado en ciertas circunstancias.pwd
potencialmente le dará menos información obsoleta que$PWD
en 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$PWD
de$(pwd -P)
, no es digno de usar$(pwd)
.cd -P -- "$dir"
. Si hay alguna duda sobre el valor de$PWD
usted siempre puedecd -P .
primero. Esto también puede ser beneficioso ya que también obtienes lo que$PWD
era antes$OLDPWD
y luego puedes compararlos después, y la próximacd ...; cd -
secuencia seguramente te llevará de regreso a donde estás ahora.Respuestas:
Si bash se encuentra
$(pwd)
, ejecutará el comando pwd y lo reemplazará$(pwd)
con la salida de este comando.$PWD
es una variable que casi siempre se establece. pwd es un comando de shell incorporado desde hace mucho tiempo.Por
$PWD
lo 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
fuente
`command`
sintaxis no era deseable y$(command)
es preferible. Hasta donde sé, este último es compatible con POSIX, pero no estoy 100% seguro.$()
está especificado por POSIX, por lo que, fuera del POSIX previo/bin/sh
disponible en Solaris 10 ycsh
shells anteriores y derivados, dudo que muchos otros shells convencionales carezcan de esa característica.$()
También debe mencionarse que
$PWD
es deseable debido a su rendimiento. Como variable de shell, se puede resolver casi al instante.$(pwd)
Es un poco más confuso. Si inspeccionaman 1 bulitin
un sistema con Bash, verá quepwd
es 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: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.fuente
echo $PWD; pushd ..; echo $PWD; popd
(con adicional>/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 lo 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.$PWD
, se realizaría en segundo plano antes de la evaluación de las declaraciones de eco. Pero claramente, el acceso$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 una sobre la otra. Gracias por el trabajo en probar esto tan a fondo. :)