我正在编写一个shell脚本,它解析当前工作目录的路径(打印当前目录之上的所有basenames )。
到目前为止,我一直在使用环境变量PWD来解析路径,但我想知道
PWD总是被设置使用pwd外壳可能更好吗?我需要这个脚本在尽可能多的平台上运行,所以我只是想知道.
发布于 2012-05-29 07:58:46
POSIX要求以以下方式设置$PWD:
PWD此变量表示当前工作目录的绝对路径名。它不应包含任何元件是点或点点.该值由cd实用程序和sh实用程序在初始化期间设置。
因此,您可以依赖于设置-但是请注意“.绝对路径.”,而不是绝对路径。
bash (至少最近的版本)将记住在设置$PWD (和pwd内置)时所遵循的符号链接。command pwd (即外部命令)不会。所以你会得到不同的结果,这对你来说可能重要,也可能不重要。如果您想要一个没有符号链接的路径,请使用pwd -P。
请注意,pwd文档声明:
如果应用程序设置或取消设置PWD的值,则未指定pwd的行为。
所以,不要这样做:)
总之,这里没有赢家。POSIX shell中将包含环境变量,外部命令以及可能的内置命令也是如此。选择最适合你需要的一种,重要的是你是否关心符号链接。
发布于 2012-05-29 07:58:37
在这篇论坛文章中,“对AIX4.2.1、AIX 6、Solaris 10和Redhat 5企业进行了比较:
前者显示带有符号链接名称的工作目录,而后者显示实际路径。
唯一的差异是,在大多数系统中,外部命令在/usr/bin中,在Redhat中是/bin。
发布于 2019-06-22 12:17:18
另一个值得注意的是在尾随的新行上,命令替换通常不安全。。
这显然是精心设计的,但是如果您真正关心的是安全处理输入,那么您应该使用"$PWD"。例如,见:
$ my_dir=$'/tmp/trailing_newline\n'
$ mkdir -p "$my_dir"
$ cd "$my_dir"
$ pwd
/tmp/trailing_newline
$ printf "%q\n" "$(pwd)" "$PWD"
/tmp/trailing_newline
$'/tmp/trailing_newline\n'
$ cd "$(pwd)"
sh: cd: /tmp/trailing_newline: No such file or directory
$ cd "$PWD"可以绕过命令替换,但这一点也不太好。您可以追加一个尾随字符,然后用一个参数展开来剥离它:
$ pwd_guarded="$(pwd; printf '#')"
$ pwd_fixed="${pwd_guarded%$'\n'#}"
$ printf "%q\n" "$pwd_fixed"
$'/tmp/trailing_newline\n'
$ cd "$pwd_fixed"这特别难看,因为您还必须去掉pwd添加的换行符,通常情况下,该换行符会被命令替换删除。如果不使用像$''这样的非POSIX结构,这就会变得一团糟,所以基本上,如果您关心这些事情,只需使用"$PWD"即可。当然,不支持目录名称中的尾换行符是完全合理的。
https://stackoverflow.com/questions/10795014
复制相似问题