簡體   English   中英

如何將Ruby主體從ruby傳遞到bash腳本

[英]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因此您正在執行以下操作:

  1. 構建命令行。
  2. /bin/sh替換當前進程。
  3. /bin/sh解析您應該混在一起的命令行。 這是您需要擔心引號和轉義符才能越過shell的地方。
  4. /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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM