2010-09-20 49 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'` 

然而,在這種情況下,可能不會有用。

相關問題