Как передать тело json из ruby ​​в bash скрипт - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь изучить bash и ruby ​​и пытаюсь передать переменную, содержащую объект JSON из ruby, для печати с использованием сценария bash.

Я пытался сохранить объект JSON в переменной, затем использовал эту переменную в качестве аргумента для моего bash-скрипта, но я не получил желаемый результат.

так что в моем рубиновом коде у меня есть это:

param = request.body
cmd = "ruby_to_bash #{param}"
exec cmd

и в моем скрипте bash я просто выводю значение аргумента:

echo $1

Например, у меня есть этот JSON:

{"first":"one","second":"two","third":"three"}

мой код только дает мне этот вывод:

{first:

Я хочу отобразить весь объект JSON. Как я могу это сделать? Любая помощь будет высоко оценена.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я думаю, что, как обычно в таких случаях, вам лучше всего не использовать снаряд.

Когда вы говорите это:

cmd = "ruby_to_bash #{param}"
exec cmd

Ваш exec вызов вызывает оболочку, которая анализирует cmd, а затем запускает ruby_to_bash, поэтому вы делаете это:

  1. Сборка командной строки.
  2. Заменить текущий процесс на /bin/sh.
  3. /bin/sh разбирает командную строку, которую вы должны объединить. Здесь вам нужно беспокоиться о цитировании и экранировании, чтобы обойти оболочку.
  4. /bin/sh exec's ruby_to_bash.

Вы можете обойти всю проблему, используя форму с несколькими аргументами Kernel#exec:

exec (cmdname, arg1, ...)
имя команды и один или несколько аргументов (без оболочки)

, который вообще не беспокоится о раковине. Если вы говорите:

exec 'ruby_to_bash', param

Вы не будете использовать оболочку, и кавычки или интервалы в param не будут иметь значения ни для кого, кроме ruby_to_bash.

0 голосов
/ 15 января 2019

И bash, и ruby ​​обрабатывают двойные кавычки особым образом: строки в двойных кавычках интерполируются перед передачей получателю. Я настоятельно рекомендую вам начать с изучения чего-то одного, в первую очередь, вместо того, чтобы добиться нулевого прогресса в обоих из-за вызванных ошибок.

Отвечая на поставленный вопрос, необходимо избегать двойных кавычек при передаче туда и обратно, так как и ruby, и bash рассматривают их как разделители содержимого и отбрасывают, когда содержимое уже проанализировано в результирующей строке.

Это будет работать:

exec %|ruby_to_bash #{param.gsub('"', '\"')}|

Я использую %| и | в качестве разделителей строк, чтобы избежать столкновений с внутренними кавычками.


Sidenote: вышеупомянутое не будет работать для ввода, содержащего пробелы, но я намеренно избегаю показывать, как обращаться с пробелами, поскольку он ведет в тупик; Обрабатывая пробелы, окружая интерполированные param одинарными кавычками, мы склонны ошибаться с внутренними одинарными кавычками в объекте JSON и т. д.

Приведенный выше код никто не должен производить на производстве.

...