BitBar使用Ruby脚本,解决无法使用Gem的问题,以及读写文件路径存在空格的问题

BitBar(现改名为xbar)是一个开源的Mac小工具,它可以把任何东西放到MacOS的状态栏上面,我现在一般用它来做TODO list。如下图所示

iShot2021-05-0317.36.38

不过,刚开始使用的时候,遇到这个一个问题,就是无法使用gem,因为BitBar默认使用的ruby版本是系统版本,而我通常使用rvm。翻了BitBar的github issues之后,找到这样一个解决办法

#!/usr/bin/env ruby

unless ENV['USING_RVM']
  # Re-run this script with RVM's default Ruby, after setting up the RVM path,
  # and setting USING_RVM to true, so that this sentry code won't run the second
  # time through.
  system(
    <<-EOF
      export USING_RVM=true
      export PATH="~/.rvm/bin:$PATH"
      rvm-auto-ruby #{File.expand_path(__FILE__)}
    EOF
  )
  # Return the exit code from running the script with RVM:
  exit $?.exitstatus.to_i
end

require 'faraday' # 可以正常使用Gem了
# 以下正常写你的脚本代码

不过,由于我的这个script文件是放在iCloud目录下的,具体路径是 /Users/myusername/Library/Mobile Documents/com~apple~CloudDocs/apps/BitBarPlugins,可以看到,中间有一个空格,于是,在代码运行到

rvm-auto-ruby #{File.expand_path(__FILE__)}

这一行的时候,遇到这样的错误提示:

Traceback (most recent call last):
ruby: No such file or directory -- /Users/chris/Library/Mobile (LoadError)

解决办法是:
require 'shellwords'
然后

rvm-auto-ruby #{File.expand_path(__FILE__)}

改成

rvm-auto-ruby #{File.expand_path(__FILE__.shellescape)} # __FILE__后面加了 .shellescape

这样,就解决了这个问题。

Leave a Reply