2014-07-12 47 views
1

我有程序的文本输出我想直接在shell中执行。我应该如何格式化这个程序的输出,使空格的路径被shell接受?

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

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

+0

你可以通过给出一个示例输入和输出来澄清吗? – bfontaine

+0

为什么你必须用'$()'执行它们? – konsolebox

+0

我必须在这里丢失一些东西...为什么不把输出包装在'“...”'中呢? '“$(echo whatever)”。 –

回答

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' 
+0

谢谢 - 我们在家里拉伸:)'ksh'好奇地_requires_ that quote(){ ''用'function quote {'(非POSIX语法)替换,否则'typeset'命令将创建_global_变量(至少在AT&T的'ksh'版本中 - 在OS X 10.9.4的'ksh 93u'上进行验证) - 请参阅http://stackoverflow.com/a/12004099/45375 – mklement0

+0

@ mklement0我已经忘记了那部分内容,但我实际上记住了它并在最后一次评论之前几分钟*修复了它。如果花费在低调的SO答案上的奖励有效,那么我们现在就有资格参加。 – user4815162342

+0

:)我确实感到自豪 - 我会从简历中链接到这个。开玩笑:我学到了一两件事,所以我不觉得这是浪费精力。最后一个建议:如何在你的答案中突出显示闪亮的三壳兼容性? – mklement0

1

我不太确定我的理解,但是你不是只想穿过壳?

对于程序调用foo

$ foo | sh 

从程序格式化输出这样的Bash不会尝试给他们空间分成参数或者更新,与任何可能比较容易只是双引号他们围绕每个参数的正常引用方法,例如

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

正如你所看到的,你可以反过来将空格反斜杠,但我发现通常不太可读。

编辑: 如果你可能有特殊的shell字符(&|``()[]$等),你就必须做到这一点硬/有道(使用你的语言和目标特定的逃避者 - 如其他人所说的

1

这不只是你需要担心的空间,但其他字符,如[](又名水珠路径膨胀字符)和元字符,如;&( ...

您可以用下面的办法:

  • 将字符串括在单个的引号中。
  • 使用'\''替换字符串中的现有单引号(它有效地将字符串拆分为多个部分,并在单引号内引用了\; shell然后将这些部分重新组装为单个字符串)。

实施例:

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

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

2

我应该如何格式化这个程序的输出,使空间被 空间所接受?

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

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

+1

+1指出语言可能已经具有此类功能。要添加一个奇特的:AppleScript有''的引用形式。 – mklement0

+1

我想为哈斯克尔我可以使用http://hackage.haskell.org/package/shell-escape-0.1.2 –