我有一个 Ruby 程序,除其他外,它执行用户定义的代码块(代码在 Github 上,here)。其中许多块包含系统命令,我正在尝试调试一个非常具体的案例,即在我正在调用的 bash 脚本中执行一段 AppleScript。有问题的脚本用于通过命令行控制 Spotify,这就是代码。
我遇到的问题是每次运行脚本时都会发生中止陷阱错误:
spotify: line 57: 94108 Abort trap osascript -e 'tell application "Spotify" to pause'
这必须与进行调用的 Ruby 脚本的环境有关,但我无法理解原因。这是调用它的代码块:
# Ruby code
reaction :hello do |event|
system "spotify pause"
system "say 'Hello world'"
system "spotify play"
end
yield
当通过套接字连接触发特定事件时,此块通过语句定期运行。该脚本也被守护,使用 ruby gem“daemons”,允许它在后台运行(但仍然作为当前用户,根据ps
和 ruby 环境变量)。不仅如此,每个套接字连接都会启动一个新线程,因此代码在与主线程不同的线程中运行。
在我的调试中,我尝试system "spotify pause"
在守护进程启动脚本后运行该行,没有问题。它在以下脚本中也运行良好:
Thread.new do
system("spotify pause")
end
因此,导致问题的不是启动新线程或本身的守护进程,但它似乎是这些事情的组合,并且可能正在产生块这一事实意味着 AppleScript 正在引发中止陷阱在 bash 脚本中。
如果您可以将自己的许多层复杂化带回现实,我将不胜感激您为解决甚至调试这个奇怪的案例提供的任何建议!