2014-09-19 61 views
0

我正在嘗試編寫一個bash函數或將別名命令傳遞給遠程API的別名。轉義使用curl的bash命令--data-urlencode

具體來說,這是我迄今爲止在.bashrc中:

explain() { 
    cmd=$(printf "%q " "[email protected]") 
    curl -Gs "https://www.mankier.com/api/explain/?format=text&cols="$(tput cols) --data-urlencode "q=$cmd" 
} 
export -f explain 

我可以使用的東西,如:

$ explain ls -lh 

但我還沒有找到一種方法來處理命令參數擴展。幾個例子:

$ explain ls -lh $HOME 

$HOME更改爲/home/j,但我想串"ls -lh $HOME"傳遞給遠程API。

$ explain ls -lh * 

*改爲該目錄的內容,但我想串"ls -lh *"傳遞給遠程API。

這是可能做到的,而不是逃避我想解釋的命令?即解釋函數中的更改不是:explain 'ls -lh *'

+0

好消息:您可以在我的[answer here](http://stackoverflow.com/a/14966731/1501222)上看到一種訪問非轉義命令的方法(它們的文件擴展名和括號評估)。壞消息:你不想那樣做 – BeniBela 2014-09-19 20:09:26

+0

非常感謝@BeniBela - 你能否將這個問題標記爲你鏈接的那個問題的重複? (我沒有足夠的聲望)。要求實際上是相同的。 – 2014-09-22 12:49:35

+0

似乎我可以投票表決(從來沒有做過之前..):可能重複[最小打字命令行計算器 - tcsh vs bash](http://stackoverflow.com/questions/14966102/minimal-typing-command-line -calculator-tcsh-vs-bash) – BeniBela 2014-09-22 12:55:50

回答

0

雙引號會插入shell變量,正如您在此處看到的$ HOME被替換爲其值。使用單引號來防止插值,explain 'ls -lh *'

+0

好大聲,謝謝。但我真的很想找到一種不用引用就能實現的方法,所以我可以運行'explain !!'來解釋最後的命令。我會修改這個問題來說明問題。我意識到這可能是不可能的,我準備接受否作爲答案。 – 2014-09-19 19:10:14