如何在UNIX上的$ PATH中转义冒号(:)?

时间:2013-02-02 11:23:43

标签: linux path escaping environment-variables

我需要在我的应用程序中解析$PATH环境变量。 所以我想知道$PATH中哪些转义字符有效。 我创建了一个名为/bin:d的测试目录,并创建了一个名为的测试脚本 其中funny。如果我用绝对路径调用它,它就会运行。 我只是无法弄清楚如何逃避: $PATH我试图逃避 带有\的冒号并将其包装为单个'和双"引号。 但总是当我运行which funny时,它无法找到它。 我正在运行CentOS 6。

4 个答案:

答案 0 :(得分:23)

根据POSIX标准,这是不可能的。这不是特定shell的功能,PATH处理是在C库的execvp函数内完成的。没有任何类型的引用。

这就是为什么包含某些字符(任何不在“可移植文件名字符集”中的内容 - 冒号都被特别调用为例)的强烈推荐。

来自SUSv7

  

由于<colon>在此上下文中是一个分隔符,因此可能在PATH中使用的目录名称不应包含<colon>个字符。

另见source of GLIBC execvp。我们可以看到它使用strchrnulmemcpy函数来处理PATH组件,绝对没有规定跳过或取消任何类型的转义字符。

答案 1 :(得分:9)

看看这个功能 extract_colon_unit 在我看来,这是不可能的。 :是无条件的 不可避免地用作路径分隔符。

嗯,这至少对 bash 有效。其他炮弹可能会有所不同。

答案 2 :(得分:3)

你可以试试mount

mount /bin:d /bind
PATH=/bind

答案 3 :(得分:-2)

根据http://tldp.org/LDP/abs/html/special-chars.html单引号应该保留所有特殊字符,所以如果不尝试它,我会认为'/ bin:d'可以在$ PATH中工作。