$ PWD与pwd关于可移植性

时间:2012-05-29 07:46:03

标签: bash

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

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

  • 我可以依靠PWD始终设置
  • 在每个平台上提供相同的结果

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

5 个答案:

答案 0 :(得分:21)

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

PWD  
     

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

所以你可以依靠被设置 - 但要注意“......绝对路径......”,而不是 绝对路径。

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

请注意pwd文档说明:

  

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

所以,不要那样做:)

简而言之,这里没有胜利者。环境变量将存在于POSIX shell中,外部命令也可能存在,也可能是内置命令。选择最适合您需求的那个,重要的是你是否关心符号链接。

答案 1 :(得分:3)

从该论坛文章"$PWD vs `pwd`"开始,它将AIX 4.2.1,AIX 6,Sparc Solaris 10和Redhat 5企业与此进行了比较:

  • $ PWD和builtin pwd之间没有区别,

  • 内置pwd -P和/ usr / bin / pwd之间没有区别。

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

唯一的区别是外部命令在大多数系统的/ usr / bin和Redhat的/ bin中。

答案 2 :(得分:2)

如果你知道bash可用并且脚本是用它执行的,那么PWD是安全的。

如果在某些系统上只有普通sh可用,请使用pwd

答案 3 :(得分:0)

如果是我,我会使用pwd,因为它是内置的bash和sh。这并不意味着它们在所有方面都起到相同的作用,但如果你在没有选项的情况下调用它,那应该不重要。

答案 4 :(得分:0)

要注意的另一点是 command substitutions are not generally safe on trailing newlines

这显然是人为的,但是如果您真的担心安全的话 处理您应该使用"$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"。当然 不支持目录中的尾随换行符是完全合理的 名称。