Командная строка Ruby:Как я могу отправить команду CTRL-C с помощью текста в командной строке?

StackOverflow https://stackoverflow.com/questions/1616982

Вопрос

Я пытаюсь создать простую каплю 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 все еще переписывается.

Итак, в принципе, мне нужно передать команду прерывания при выходе из .app.

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

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

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

Это было полезно?

Решение

Если вы нажмете CTRL-C в своей консоли, это сообщение не будет отправлено через STDIN в вашу программу.Bash (или что бы вы ни использовали) обрабатывает CTRL-C по-особому.Bash посылает сигнал процессу.В случае CTRL-C это SIGINT .Чтобы отправить сигнал программе, вам не нужно указывать ее pid.Затем вы можете отправить сигнал на 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&") который также возвращает imidietly, но всегда возвращает 0.

Другие советы

Подсказка:Что означает ^C Контроль-C в самом деле делать в скорлупе?

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

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

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

Счастливого кодирования.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top