![使用 $(pwd) 还是 $PWD 更好?](https://linux22.com/image/34769/%E4%BD%BF%E7%94%A8%20%24(pwd)%20%E8%BF%98%E6%98%AF%20%24PWD%20%E6%9B%B4%E5%A5%BD%EF%BC%9F.png)
我BASEDIR=$(pwd)
在一个脚本中遇到了。
除了可能被覆盖BASEDIR="$PWD"
之外,与使用相比还有什么优点或缺点吗?$PWD
答案1
如果 bash 遇到它,$(pwd)
它将执行命令 pwd 并替换$(pwd)
为该命令的输出。$PWD
是一个几乎总是被设置的变量。 pwd 长期以来都是一个内置的 shell 命令。
因此,$PWD
如果未设置此变量,将会失败;$(pwd)
如果您使用的 shell 不支持该$()
构造,则将会失败,根据我的经验,这种情况很常见。所以我会使用$PWD
.
正如每个书呆子一样,我也有自己的shell 脚本编写教程
答案2
还应该提到的是,$PWD
由于其性能,这是理想的。作为 shell 变量,它几乎可以立即解析。$(pwd)
有点令人困惑。如果您man 1 bulitin
使用 Bash 检查系统,您会发现这pwd
是一个内置命令,这可能会让您相信它与访问变量一样快。然而,该$()
构造总是启动一个新的子 shell(一个新进程)来运行其内容,无论里面有什么。反引号也是如此。事实上,当我对其进行基准测试时:
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)
我的通话时间为 1.52 秒$(pwd)
,.018 秒$PWD
。应尽可能避免不必要的子 shell 以及任何其他无关进程的启动。它们比您在其他语言中可能习惯的函数调用要昂贵得多。