Немного поиграв с irb
, вот что я нашел.
Оператор обратного вызова вызывает оболочку после того, как ruby выполнил любую необходимую интерпретацию. Для моего тестового примера вывод strace
выглядел примерно так:
execve("/bin/sh", ["sh", "-c", "echo at 12:57 < /etc/fstab"], [/* 67 vars */]) = 0
Поскольку мы знаем, что он делает, давайте посмотрим, как будет выполняться ваша команда:
/bin/sh -c "at 12:57 < RAILS_ROOT/lib/parking_timer.sh STRING_VARIABLE"
Это выглядит очень странно . Вы действительно хотите передать parking_timer.sh
, скрипт, как ввод в команду at
?
То, что вы, вероятно, в конечном итоге хотите, примерно так:
/bin/sh -c "RAILS_ROOT/lib/parking_timer.sh STRING_VARIABLE | at 12:57"
Таким образом, выходные данные команды parking_timer.sh
станут входными данными для команды at
.
Итак, попробуйте следующее:
output = `#{Rails.root}/lib/parking_timer.sh STRING_VARIABLE | at #{(Time.now + 60).strftime("%H:%M")}`
return render :text => output
Вы всегда можете использовать strace
или truss
, чтобы увидеть, что происходит. Например:
strace -o strace.out -f -ff -p $IRB_PID
Затем grep '^exec' strace.out*
, чтобы увидеть, где выполняется команда.