如何在 OS X 上的 Ruby 脚本中使用来自 shell 的 Bash 别名?

How to use Bash aliases from a shell in a Ruby script on OS X?

如何在 Ruby 脚本中从我的 Bash shell 执行别名?

代码如下:

aliases = [ 'ul', 'ur', 'dl', 'dr', 'll', 'rr', 'up', 'down', 'big', 'cen' ]

while true
    a = aliases.sample
    `#{a}`
    puts `figlet -f doh "#{a}"`
end

我愿意:

但是:

Bash 手册页的快速检查显示:

Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS below).

快速搜索 "shell shopt expand_aliases" 显示了一堆匹配项。

参见“Difference between .bashrc and .bash_profile", "Why aliases in a non-interactive Bash shell do not work", "Why doesn't my Bash script recognize aliases?" and "Non-interactive shell expand alias”。

alias 是关键字,绝不能用作变量名或方法名。

  1. 单词alias是Ruby中的关键字,因此您不能将其用作标识符。

  2. 当您从 Bash 执行 source xxxx 时,它会将文件 "xxxx" 解释为 Bash 程序。您的文件是一个 Ruby 程序,因此无法找到它。

事实证明,解决方案是 运行 Ruby 脚本中的 shell 命令作为交互式 shell(因此 .bashrc来源和别名可用于 shell 的环境):

aliases = [ 'ul', 'ur', 'dl', 'dr', 'll', 'rr', 'up', 'down', 'big', 'cen' ]

while true
    a = aliases.sample
    `bash -ic '#{a}'`
    puts `figlet -f doh "#{a}"` 
end