Почему я не могу назвать "историю" изнутри Ruby? - PullRequest
3 голосов
/ 20 сентября 2010

Я могу запускать команды оболочки Bash из Ruby-программы или irb с помощью обратных галочек (и% x (), system и т. Д.).Но по какой-то причине это не работает с историей.

Например:

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 вызывает новую оболочку - он просто не находит эту команду ...

Кто-нибудь знает почему?Я в тупике ...

Ответы [ 3 ]

10 голосов
/ 20 сентября 2010

Большинство команд unix реализованы в виде исполняемых файлов, и оператор backtick дает вам возможность выполнять эти команды из вашего скрипта.Однако некоторые команды, которые интерпретируются bash, не являются исполняемыми файлами;это функции, встроенные в саму команду bash.history - одна из таких команд.Единственный способ выполнить эту команду - сначала выполнить bash, а затем попросить ее выполнить эту команду.

Вы можете использовать команду type, чтобы сообщить вам тип конкретной команды, чтобы узнать, можете ли вы выполнить ее из ruby ​​(или сценариев python, perl, Tcl и т. Д.).Например:

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

Вы также обнаружите, что не можете выполнять псевдонимы, определенные в вашем файле .bashrc, поскольку они также не являются исполняемыми файлами.

Это помогаетпомните, что выполнение команды означает не «запустить эту команду оболочки», а «запустить этот исполняемый файл».Если это не исполняемый файл, вы не можете его выполнить.

4 голосов
/ 20 сентября 2010

Это встроенный.Как правило, вы можете запускать встроенные модули, вызывая оболочку вручную:

`bash -c 'history'`

Однако в этом случае это, вероятно, не будет полезным.

0 голосов
/ 20 сентября 2010
{~} ∴ which history
history: shell built-in command
...