我正在尝试创建一个简单的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 &")
这很好但是我希望在退出自动贩毒应用程序时停止--watch。
LESS文档说在命令行shell中按CTRL-C快捷键以中止脚本。
但由于我不在终端窗口内(命令在后台传递),我不知道如何中止脚本。
即使在automator.app关闭后,style.less
文件仍在监视更改,相应生成的style.css
仍在被重写。
所以基本上我需要在退出.app。
时传递abort命令我已经生成了一个简单的弹出窗口,点击该按钮会在将另一个命令传递给终端shell后关闭应用。
这是我所有尝试都不能成功停止脚本的部分。
是否有与按CTRL-C命令相同的命令行功能? 我怎么把这个最好的传递到shell?
答案 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)
less也会终止。