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 脚本? [复制]