4

我正在尝试创建一个简单的 Automator droplet,它将style.less文件放入其中并在其上运行以下 LESS 命令:

$ LESSC {DROPPED_FILE} --watch

它将监视我放入的文件是否有任何更改,然后会自动更新输出的style.css

仅供参考:我正在使用 LESS 来动态编写 CSS 文件。更多信息在这里

基本液滴效果很好。

  1. 删除的文件被传递到一个变量中;为此:{MY_VAR}.
  2. 我在shell中运行一个shell脚本/usr/bin/ruby如下system("lessc {MY_VAR} --watch &")

这很好用,但是我希望 --watch 在退出 automator 应用程序时停止。

LESS 文档说在命令行 shell 中按 CTRL-C 快捷键以中止脚本。

但由于我不在终端窗口内(命令在后台传递),我不知道如何中止脚本。

即使在 automator.app 已关闭后,该style.less文件仍会被监视更改,并且相应生成style.css的文件仍在被重写。

所以基本上我需要在.app退出时传递中止命令。

我生成了一个简单的弹出窗口,单击该窗口将在将另一个命令传递给终端 shell后关闭应用程序。

这是我所有尝试都未能成功停止脚本的部分。

是否有与按 CTRL-C 命令相同的命令行功能?我如何将这个最好的传递给外壳?

4

3 回答 3

6

如果您在控制台中按 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&")了 which 也返回 imidietly 但总是返回 0。

于 2009-10-24T11:54:07.297 回答
2

提示: ^C在 shell 中Control-C 真正做了什么?

(它不发送字符)。

提示说明:PDF 讨论信号。注意它在哪里也谈到了^C。您可以根据需要手动发送信号。

当您在终端中按 ^C 时,它通常会向正在运行的程序发送 SIGINT 信号。您也可以在 Ruby 中发送这些信号。有关在 Ruby 中处理进程(和发送信号)的更多信息:http ://whynotwiki.com/Ruby_/_Process_management 。

快乐编码。

于 2009-10-24T06:32:36.307 回答
0

我认为,当它收到“q”字符时,less 也会终止。

于 2009-10-24T04:54:11.167 回答