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

4
我正在尝试创建一个简单的Automator拖放应用程序,它将接受被拖入其中的style.less文件,并在其上运行以下LESS命令: $ LESSC {DROPPED_FILE} --watch 这将监视我所拖放的文件是否有任何更改,然后自动更新输出的style.css
FYI:我正在使用LESS来动态编写CSS文件。更多信息请参见此处
基本的拖放应用程序非常好用。
1.被拖放的文件被传递到一个变量中;为此目的:{MY_VAR}。 2.我在/usr/bin/ruby shell中运行一个shell脚本,如下所示:system("lessc {MY_VAR} --watch &") 这很好用,但是我希望在退出automator.app时停止--watch。
LESS文档说要在命令行shell中按CTRL-C快捷键以中止脚本。
但是由于我不在终端窗口内(命令正在后台传递),我不知道如何中止脚本。
即使在关闭automator.app之后,style.less文件仍在被监视更改,并且相应生成的style.css仍在被重写。
因此,基本上我需要在退出.app时传递中止命令。
我已经生成了一个简单的弹出窗口,点击后将在传递另一个命令到终端shell之后关闭应用程序。
这是我所有尝试都无法成功停止脚本的部分。
是否有一个命令行函数,可以执行与按下CTRL-C命令相同的操作? 我该如何最好地将其传递给shell?
3个回答

6
如果你在控制台中按下CTRL-C,这并不会通过标准输入发送到你的程序。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 中,至少有三种不同的执行方式。
`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。


感谢您抽出时间来写这篇文章。不过我有一个问题,我确实很新手,对于命令行 Ruby 这方面只是靠着复制粘贴和遵循网上的指示才能完成。在这种情况下,我不太确定如何运行您给我的命令...我该如何将终端实例输入“Ruby”模式?另外:每一行都是单独的命令吗(也就是说,我输入第一行然后按“回车”,然后输入第二行等等)? - Jannis
当我看到 Ruby 标签时,我假定你想要编写一个 Ruby 脚本。 - johannes

2

提示:在 shell 中,^C Control-C 究竟是做什么的?

(它不会发送字符)。

提示澄清:这个PDF 文件介绍了信号。请注意它也讲到了 ^C。您可以按需要手动发送一个信号。

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

祝编码愉快。


这是否意味着没有办法停止脚本,除非使用终端并实际按下CTRL-C键组合? - Jannis
完全不是这样。交互式终端只是拦截^C并使其执行某些特殊操作。同样适用于^D和^Z等常规情况。您可以直接执行终端所做的操作。 - user166390
我已经阅读了这份PDF,但由于我离程序员还很远,所以很难理解。我只是想创建这个小程序来使我的工作流程更快捷。 看起来这对我来说不是一个选择。无论如何,感谢你的提示,也许如果我在这个领域有更多的知识,我会更好地理解它。 - Jannis

0

当 less 接收到字符 "q" 时,它也会终止,我想。


嗯...我尝试执行$ lessc q,但不幸的是它没有起作用。不过还是谢谢你的建议,非常感谢。 - Jannis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接