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


35

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

除了使用BASEDIR="$PWD"以外,是否还有其他优点或缺点$PWD会被覆盖?



@StéphaneChazelas非常有趣的写作。我只是半路而已,并且会继续,但是据我所知,最好使用$(pwd),因为$PWD在某些情况下可能会过时。
Minix

2
仅在某些shell中(例如,不是bash,dash,zsh或ksh93),与某些极端情况pwd相比$PWD,可能会给您更少的过时信息。$(pwd)另一方面,如果当前目录以换行符结尾,则无效,这意味着派生一个进程(ksh93除外)并使用额外的资源。我的看法是使用$PWD$(pwd -P),这是不值得使用$(pwd)
斯特凡Chazelas

1
在底部,斯蒂芬提到使用cd -P -- "$dir"。如果对$PWD您的价值有任何疑问,可以永远cd -P .先行。这也可能是有益的,因为您还可以获得$PWD之前的内容,$OLDPWD因此可以在之后进行比较-并且下一个cd ...; cd -序列将确保您回到现在的位置。
mikeserv 2014年

Answers:


41

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

因此,$PWD如果未设置此变量,$(pwd)将失败;如果您使用的外壳程序不支持该$()构造,则失败;据我的经验,这种情况很常见。所以我会用$PWD

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


6
我的印象是`command`语法是不受欢迎的,$(command)应该被首选。据我所知,后者是POSIX兼容的,但我不确定100%。
Minix

6
@Minix $()确实是POSIX指定的,因此/bin/sh在Solaris 10以及更早版本和csh派生Shell 上可用的POSIX之前的版本之外,我怀疑许多其他主流Shell缺少该功能。
jlliagre 2014年

@Minix:是此站点上最近出现的问题,它说明了使用反引号代替$()
PM 2Ring的问题

正确,可以使用反引号代替$(),但这不是可层叠的,因此我没有提及
Thorsten Staerk 2014年

1
在您的教程尼斯小地图....
kbtzr

6

还应该提到的$PWD是,由于其性能,它是理想的。作为shell变量,几乎可以立即解决它。$(pwd)有点混乱。如果您man 1 bulitin在使用Bash的系统上进行检查,您会发现这pwd是一个内置命令,可能使您相信它与访问变量一样快。但是,该$()构造始终启动一个新的子外壳程序(一个新进程)以运行其内容,而不管其中包含什么内容。反引号也一样。确实,当我进行基准测试时:

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)

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


这很有趣,但是我不知道我是否担心shell脚本的性能。我也想知道,如果查询之间的pwd发生变化,性能将如何变化。
Minix

@Minix我修改了我的脚本,使之成为循环体echo $PWD; pushd ..; echo $PWD; popd>/dev/null每个语句后都有附加的),这需要0.05秒。然后,我删除了echo语句(仅被推入/弹出),并且花了0.03。因此,每个时间echo $PWD仍为0.01秒左右。我使用做了类似的事情$(pwd),每个循环花了2.2秒,所以每次$(pwd)调用花了1.1秒。
markasoftware

不必太挑剔,但我可以想象,将要替换的计算$PWD将在对echo语句求值之前在后台完成。但是显然,访问$PWD仍然明显更快,因此,如果不考虑兼容性,这绝对是一个选择另一个的理由。感谢您进行如此彻底的测试。:)
Minix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.