Командная строка Ruby:Как я могу отправить команду CTRL-C с помощью текста в командной строке?
-
06-07-2019 - |
Вопрос
Я пытаюсь создать простую каплю Automator, которая будет принимать style.less
поместите в него файл и запустите над ним следующую команду LESS:
$ LESSC {DROPPED_FILE} --watch
который будет отслеживать загруженный мной файл на предмет любых изменений, а затем автоматически обновит выведенный style.css
К ТВОЕМУ сведению:Я использую LESS для создания динамически записываемых CSS-файлов.Более подробная информация есть здесь.
Базовая капелька работает отлично.
- Удаляемый файл передается в переменную;Для этой цели:
{MY_VAR}
. - Я запускаю сценарий оболочки в
/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".