Ruby命令行:如何通过命令行中的文本发送CTRL-C命令?

时间:2009-10-24 04:43:31

标签: css ruby command-line abort less

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

$ LESSC {DROPPED_FILE} --watch

将监控我已删除的文件以进行任何更改,然后会自动更新输出的style.css

仅供参考:我使用LESS来动态编写CSS文件。更多信息是here

基本液滴效果很好。

  1. 将删除的文件传递给变量;为此目的:{MY_VAR}
  2. 我在/usr/bin/ruby shell中运行一个shell脚本,如下所示system("lessc {MY_VAR} --watch &")
  3. 这很好但是我希望在退出自动贩毒应用程序时停止--watch。

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

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

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

    所以基本上我需要在退出.app。

    时传递abort命令

    我已经生成了一个简单的弹出窗口,点击该按钮会在将另一个命令传递给终端shell后关闭应用

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

    是否有与按CTRL-C命令相同的命令行功能? 我怎么把这个最好的传递到shell?

3 个答案:

答案 0 :(得分: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)

在红宝石中,至少有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.

答案 1 :(得分:1)

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

(它不发送角色)。

提示澄清:PDF talks about signals。注意它还谈到了^ C。您可以根据需要手动发送信号。

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

快乐的编码。

答案 2 :(得分:0)

当我收到“q”字符时,

less也会终止。