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

Posted

技术标签:

【中文标题】Ruby 命令行:如何通过命令行中的文本发送 CTRL-C 命令?【英文标题】:Ruby Command Line: How can I send the CTRL-C command via text in the command line? 【发布时间】:2009-10-24 04:43:30 【问题描述】:

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

$ LESSC DROPPED_FILE --watch

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

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

基本液滴效果很好。

    拖放的文件被传递到一个变量中;为此:MY_VAR。 我在/usr/bin/ruby shell 中运行一个shell 脚本,如下system("lessc MY_VAR --watch &")

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

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

如果您在控制台中按 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&"),它也即时返回,但始终返回 0。

【讨论】:

感谢您抽出宝贵时间来解决这个问题。一个简单的问题,我对命令行 ruby​​ 的东西确实很陌生,到目前为止,我只能幸运地复制粘贴并遵循我可以在网上找到的说明,在这种情况下:我不太确定如何实际运行你的命令给了我..我如何将我的终端实例输入“红宝石”模式?另外:每一行是一个单独的命令(就像我输入第一行并按'return'然后按第二行等等? 当我看到 ruby​​ 标签时,我以为你想写一个 ruby​​ 脚本。【参考方案2】:

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

(它不发送字符)。

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

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

编码愉快。

【讨论】:

这是否意味着不使用终端并实际按下 CTRL-C 组合键就无法停止脚本? 一点也不。交互式终端只是拦截 ^C 并让它做一些特别的事情。例如,与通常正确的 ^D 和 ^Z 相同。你可以直接做终端做的事情。 我通读了 PDF,但由于我远不是程序员,所以我很难理解。从长远来看,我只是想创建这个小液滴以使我的工作流程更快。看来这对我来说不是一个选择。仍然感谢您的提示,也许如果我在这方面有更多的知识,我会更好地理解它。【参考方案3】:

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

【讨论】:

hmm.. 我尝试做$ lessc q,但不幸的是它没有工作。不过感谢您的想法,非常感谢。

以上是关于Ruby 命令行:如何通过命令行中的文本发送 CTRL-C 命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一命令行中的文件上执行 python 脚本? [复制]

在windows命令行中如何运行c程序的文本

如何在 Grub 中添加菜单项以在命令行中启动 Ubuntu [关闭]

如何在命令行中捕获值并添加到配方中?

JAVA程序命令行中有空格问题

在命令行中使用 curl 通过 JSON 对象发布数据