首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$PWD与pwd关于可移植性的比较

$PWD与pwd关于可移植性的比较
EN

Stack Overflow用户
提问于 2012-05-29 07:46:03
回答 5查看 9.6K关注 0票数 22

我正在编写一个shell脚本,它解析当前工作目录的路径(打印当前目录之上的所有basenames )。

到目前为止,我一直在使用环境变量PWD来解析路径,但我想知道

  • 我可以指望PWD总是被设置
  • 在每个平台上给出相同的结果

使用pwd外壳可能更好吗?我需要这个脚本在尽可能多的平台上运行,所以我只是想知道.

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-29 07:58:46

POSIX要求以以下方式设置$PWD

PWD此变量表示当前工作目录的绝对路径名。它不应包含任何元件是点或点点.该值由cd实用程序和sh实用程序在初始化期间设置。

因此,您可以依赖于设置-但是请注意“.绝对路径.”,而不是绝对路径。

bash (至少最近的版本)将记住在设置$PWD (和pwd内置)时所遵循的符号链接。command pwd (即外部命令)不会。所以你会得到不同的结果,这对你来说可能重要,也可能不重要。如果您想要一个没有符号链接的路径,请使用pwd -P

请注意,pwd文档声明:

如果应用程序设置或取消设置PWD的值,则未指定pwd的行为。

所以,不要这样做:)

总之,这里没有赢家。POSIX shell中将包含环境变量,外部命令以及可能的内置命令也是如此。选择最适合你需要的一种,重要的是你是否关心符号链接。

票数 31
EN

Stack Overflow用户

发布于 2012-05-29 07:58:37

在这篇论坛文章中,对AIX4.2.1、AIX 6、Solaris 10和Redhat 5企业进行了比较:

  • $PWD和内置pwd没有差别,
  • 内建pwd -P与/usr/bin/pwd之间无差异。

前者显示带有符号链接名称的工作目录,而后者显示实际路径。

唯一的差异是,在大多数系统中,外部命令在/usr/bin中,在Redhat中是/bin。

票数 4
EN

Stack Overflow用户

发布于 2019-06-22 12:17:18

另一个值得注意的是在尾随的新行上,命令替换通常不安全。

这显然是精心设计的,但是如果您真正关心的是安全处理输入,那么您应该使用"$PWD"。例如,见:

代码语言:javascript
复制
$ 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"

可以绕过命令替换,但这一点也不太好。您可以追加一个尾随字符,然后用一个参数展开来剥离它:

代码语言:javascript
复制
$ pwd_guarded="$(pwd; printf '#')"
$ pwd_fixed="${pwd_guarded%$'\n'#}"
$ printf "%q\n" "$pwd_fixed"
$'/tmp/trailing_newline\n'
$ cd "$pwd_fixed"

这特别难看,因为您还必须去掉pwd添加的换行符,通常情况下,该换行符会被命令替换删除。如果不使用像$''这样的非POSIX结构,这就会变得一团糟,所以基本上,如果您关心这些事情,只需使用"$PWD"即可。当然,不支持目录名称中的尾换行符是完全合理的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10795014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档