Командная строка Ruby: Как я могу отправить команду CTRL-C через текст в командной строке? - PullRequest
3 голосов
/ 24 октября 2009

Я пытаюсь создать простую каплю Automator, в которую будет помещен файл style.less и запущена следующая команда LESS:

$ LESSC {DROPPED_FILE} --watch

, который будет следить за файлом, который я добавил, для любых изменений, а затем автоматически обновляет вывод style.css

К вашему сведению: я использую LESS для динамически написанных файлов CSS. Более подробная информация здесь .

Основная капля прекрасно работает.

  1. Удаленный файл передается в переменную; Для этого: {MY_VAR}.
  2. Я запускаю скрипт оболочки в оболочке /usr/bin/ruby следующим образом system("lessc {MY_VAR} --watch &")

это прекрасно работает, однако я хочу, чтобы --watch был остановлен при выходе из приложения automator.

В документации LESS говорится, что нужно нажать сочетание клавиш CTRL-C в командной строке, чтобы прервать выполнение сценария.

Но поскольку я не нахожусь в окне терминала (команда передается в фоновом режиме), я не знаю, как прервать выполнение сценария.

Даже после закрытия automator.app файл style.less все еще отслеживается на предмет изменений, а соответствующий сгенерированный style.css все еще переписывается.

Так что в основном мне нужно передать команду abort при выходе из .app.

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

Это часть, где все мои попытки были неудачны, чтобы остановить сценарий.

Есть ли функция командной строки, которая действует так же, как нажатие клавиши CTRL-C? Как бы я передал это лучше всего в оболочку?

Ответы [ 3 ]

6 голосов
/ 24 октября 2009

Если вы нажмете CTRL-C на своей консоли, это не будет отправлено через STDIN в вашу программу. Bash (или что вы используете) обрабатывает CTRL-C особенным. Bash отправляет сигнал процессу. В случае CTRL-C это SIGINT. Чтобы отправить сигнал в программу, вам не нужно, чтобы это был pid. Затем вы можете отправить сигнал на пид. Чтобы получить pid, вы можете запустить процесс с помощью ruby.

p= IO.popen("lessc #{file} --watch")
pid= p.pid
Process.kill("INT", pid)

В ruby ​​есть как минимум 3 различных способа выполнения чего-либо.

`lessc #{file} --watch` # returns stdout after exit
system("lessc #{file} --watch") # returns the integer return value after exit
Io.popen("lessc #{file} --watch") # returns imidietly an io object, where STDIN and STDOUT can be written and read

Вы использовали system("lessc #{file} --watch&"), который также возвращает сразу, но всегда возвращает 0.

1 голос
/ 24 октября 2009

Подсказка: что ^ C Control-C действительно делает в оболочке?

(Символ не отправляется).

Разъяснение по подсказке: Этот PDF говорит о сигналах . Обратите внимание, где это также говорит о ^ C. Вы можете вручную отправить сигнал при необходимости.

Когда вы нажимаете ^ C в терминале, он обычно посылает сигнал SIGINT в программу, которая работает. Вы также можете отправить эти сигналы в Ruby. Подробнее о работе с процессами (и отправке сигналов) в Ruby: http://whynotwiki.com/Ruby_/_Process_management.

Удачного кодирования.

0 голосов
/ 24 октября 2009

меньше также завершается, когда он получает символ "q", я думаю.

...