如何使用$()转义要执行的路径?

时间:2014-07-12 12:28:39

标签: bash shell

我有程序的文本输出我想直接在shell中执行。如何格式化该程序的输出,以便shell接受带空格的路径?

$(echo ls /folderA/folder\ with\ spaces/)

更多信息:生成输出的程序在Haskell(source)中编码。这是一个简单的程序,它保存了我最喜欢的命令列表。它使用' cmdl -l'打印命令。然后我可以选择一个命令来执行' cmdl -g12'对于命令编号12.感谢指出,而不是$()使用' cmdl -g12 | bash',我不知道......

4 个答案:

答案 0 :(得分:2)

  

如何格式化此程序的输出以使路径具有   shell接受空格?

shell不能区分作为路径一部分的空格和作为参数之间的分隔符的空格,除非正确引用它们。此外,您实际上需要使用单引号(' ... ')进行适当的引用,以“屏蔽”所有可能对shell具有特殊含义的字符组合(\&|||,...)。

根据外部工具使用的语言,它们可能是可用于此目的的库。例如,Python有pipes.quote(Python 3上为shlex.quote),Perl有String::ShellQuote::shell_quote

答案 1 :(得分:1)

我不太清楚我明白了,但是你不想只穿过外壳吗?

对于名为foo

的程序
$ foo | sh

要从程序中格式化输出,以便Bash不会尝试将它们空间分隔成参数更新,最简单的方法就是用每个参数的任何正常引用方法对它们进行双引号,例如

mkdir "/tmp/Joey \"The Lips\" Fagan"

如您所见,您可以替代地反斜杠,但我发现通常不太可读。

编辑: 如果您可能有特殊的shell字符(&|``()[]$等),则必须以硬/正确的方式(使用特定的语言和目标的转义器) - 正如其他人提到的那样。

答案 2 :(得分:1)

这不仅仅是您需要担心的空间,而是其他字符,例如[](glob aka pathname-expansion characters)和元字符,例如;,{{1 },&,...

您可以使用以下方法:

  • 将字符串括在引号中。
  • 使用(替换字符串中的现有单引号(有效地将字符串分解为多个部分,并在'\''中拼接 - 转义单引号;然后shell将部件重新组合为单个字符串)。

示例:

\将编码为I'm good (& well[1];)

请注意单引号如何允许直接使用glob字符和元字符 由于单引号本身永远不能在单引号字符串中使用(甚至没有转义),因此需要上述拼接方法。

答案 3 :(得分:0)

正如@ mklement0所描述的,一个安全的算法是将每个参数包装在一对单引号中,并在参数内引用单引号'\''。这是一个执行它的shell函数:

function quote {
    typeset cmd="" escaped
    for arg; do
        escaped=${arg//\'/\'\\\'\'}
        cmd="$cmd '$escaped'"
    done
    printf %s "$cmd"
}

$ quote foo "bar baz" "don't do it"
 'foo' 'bar baz' 'don'\''t do it'