[英]How to pass a json body from ruby to bash script
我正在嘗試研究bash和ruby,並且試圖傳遞一個包含來自ruby的JSON對象的變量,以便使用bash腳本進行打印。
我嘗試將JSON對象存儲在變量中,然后將該變量用作bash腳本的參數,但沒有得到想要的結果。
所以在我的Ruby代碼中,我有這個:
param = request.body
cmd = "ruby_to_bash #{param}"
exec cmd
在我的bash腳本中,我只是輸出參數的值:
echo $1
例如我有這個JSON:
{"first":"one","second":"two","third":"three"}
我的代碼只給我這樣的輸出:
{first:
我想顯示整個JSON對象。 我怎樣才能做到這一點? 任何幫助將不勝感激。
bash和ruby都以一種特殊的方式處理雙引號:雙引號字符串在傳遞給接收器之前會被插值 。 我強烈建議您從頭開始學習一些技巧,而不要因誘發的錯誤而使兩者都沒有取得零進展。
回答上述問題后,在來回傳遞時必須將雙引號轉義,因為ruby和bash都將它們視為內容定界符,而當內容已在結果字符串中解析時則將其丟棄。
這將工作:
exec %|ruby_to_bash #{param.gsub('"', '\"')}|
我使用%|
和|
作為字符串定界符,以避免與內部引號沖突。
旁注:以上內容不適用於包含空格的輸入,但是我故意避免顯示如何處理空格,因為它會導致死胡同; 一旦處理了帶單引號的插值param
周圍的空間,我們就很容易被JSON對象中的內部單引號搞砸了,依此類推。
上面的代碼不是有人應該在生產中生產的。
我認為,在這種情況下,您最好還是完全不要使用shell。
當你這樣說:
cmd = "ruby_to_bash #{param}"
exec cmd
您的exec
調用正在調用一個shell,該shell解析cmd
,然后運行ruby_to_bash
因此您正在執行以下操作:
/bin/sh
替換當前進程。 /bin/sh
解析您應該混在一起的命令行。 這是您需要擔心引號和轉義符才能越過shell的地方。 /bin/sh
exec的ruby_to_bash
。 您可以使用Kernel#exec
的多參數形式來繞過整個問題:
exec(cmdname,arg1,...)
命令名稱和一個或多個參數(無外殼)
根本不用理會外殼。 如果你說:
exec 'ruby_to_bash', param
您將不涉及外殼,並且param
的引號或空格對ruby_to_bash
以外的任何人都ruby_to_bash
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.