使用 $(pwd) 还是 $PWD 更好?

Min*_*nix 62 shell-script pwd

BASEDIR=$(pwd)在脚本中遇到过。

BASEDIR="$PWD"除了可能$PWD会被覆盖之外,使用 是否有任何优点或缺点?

Tho*_*erk 73

如果 bash 遇到$(pwd),它将执行命令 pwd 并替换$(pwd)为该命令的输出。$PWD是一个几乎总是设置的变量。pwd 是很长一段时间以来的内置 shell 命令。

因此,$PWD如果未设置此变量,$(pwd)则会失败,如果您使用的 shell 不支持根据$()我的经验经常出现这种情况的构造,则会失败。所以我会使用$PWD.

作为每个书呆子,我都有自己的shell 脚本教程

  • 我的印象是 `\`command\` 语法是不可取的,而 `$(command)` 是首选。据我所知,后者是 POSIX 兼容的,但我不是 100% 确定。 (7认同)
  • @Minix `$()` 确实是由 POSIX 指定的,所以在 Solaris 10 及更早版本上可用的 pre POSIX `/bin/sh` 和 `csh` 派生 shell 之外,我怀疑许多其他主流 shell 缺乏该功能。 (7认同)

mar*_*are 12

还应该提到的$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)
Run Code Online (Sandbox Code Playgroud)

我得到 1.52 秒的$(pwd)通话时间和 0.018 秒的通话时间$PWD。应尽可能避免不必要地启动子 shell 以及任何其他无关进程。它们比您在其他语言中可能习惯的函数调用要昂贵得多。