为什么我不能在Ruby中调用`history`?

时间:2010-09-20 15:52:21

标签: ruby bash history

我可以使用Ruby程序或irb使用反引号(和%x(),系统等)运行Bash shell命令。但由于某种原因,这与历史无关。

例如:

jones$ irb --simple-prompt
>> `whoami`
=> "jones\n"
>> `history`
(irb):2: command not found: history
=> ""

从Ruby程序中产生此错误:

/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31: command not found: history

在bash中,这些命令工作正常

这不是Ruby调用正在调用一个新shell - 它根本找不到该命令......

任何人都知道为什么?我很难过......

3 个答案:

答案 0 :(得分:10)

大多数unix命令都是作为可执行文件实现的,反引号操作符使您能够在脚本中执行这些命令。但是,bash解释的某些命令不是可执行文件;它们是内置于bash命令本身的功能。 history就是这样一个命令。执行此命令的唯一方法是首先执行bash,然后让它运行该命令。

您可以使用命令type告诉您特定命令的类型,以便知道您是否可以从ruby(或python,perl,Tcl等脚本)执行它。例如:

$ type history
history is a shell builtin
$ type cat
cat is /bin/cat

您还会发现您不能执行.bashrc文件中定义的别名,因为它们也不是可执行文件。

有助于记住,执行命令并不意味着“运行此shell命令”而是“运行此可执行文件”。如果它不是可执行文件,则无法执行。

答案 1 :(得分:4)

这是一个内置的。通常,您可以通过手动调用shell来运行内置函数:

`bash -c 'history'`

然而,在这种情况下,这可能没用。

答案 2 :(得分:0)

{~} ∴ which history
history: shell built-in command