2010-09-20 46 views
3

我可以使用反引号(和%x(),系统等)使用Ruby程序或irb运行Bash shell命令。但由于某些原因,这并不符合历史。为什么我不能从Ruby中调用`history`?

例如:

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 - 它根本找不到那个命令...

Anyo ne知道为什么?我很难...

回答

10

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

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

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

你还会发现,你能不能Exec在你的.bashrc文件中定义的别名任,因为这些都不是可执行文件,无论是。

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

+4

同样有用的方法可以通过反引号/ etc来调用它:echo“history”| bash -i 2>/dev/null(信用:theosp) – Kevin 2012-08-05 06:07:59

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

这是一个内置的。在一般情况下,可以通过手动调用shell中运行内建:

`bash -c 'history'` 

然而,在这种情况下,可能不会有用。

相关问题