2014-07-12 50 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 –