3 Stimmen

Warum kann ich `history` nicht aus Ruby heraus aufrufen?

Ich kann Bash-Shell-Befehle von einem Ruby-Programm oder irb aus mit Backticks (und %x(), system usw.) ausführen. Aber das funktioniert aus irgendeinem Grund nicht mit history.

Zum Beispiel:

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

Innerhalb eines Ruby-Programms erzeugt es diesen Fehler:

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

In der Bash selbst funktionieren diese Befehle problemlos

Es liegt nicht daran, dass der Ruby-Aufruf eine neue Shell aufruft - er findet diesen Befehl einfach nicht...

Weiß jemand, warum? Ich bin verblüfft...

10voto

Bryan Oakley Punkte 337213

Die meisten Unix-Befehle sind als ausführbare Dateien implementiert, und der Backtick-Operator gibt Ihnen die Möglichkeit, diese Befehle innerhalb Ihres Skripts auszuführen. Einige Befehle, die von der Bash interpretiert werden, sind jedoch keine ausführbaren Dateien; sie sind Funktionen, die in den Bash-Befehl selbst eingebaut sind. history ist ein solcher Befehl. Die einzige Möglichkeit, diesen Befehl auszuführen, besteht darin, zuerst die Bash auszuführen und sie dann zu bitten, diesen Befehl auszuführen.

Sie können den Befehl type um Ihnen den Typ eines bestimmten Befehls mitzuteilen, damit Sie wissen, ob Sie ihn von einem Ruby- (oder Python, Perl, Tcl-, etc.) Skript aus ausführen können. Zum Beispiel:

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

Sie werden auch feststellen, dass Sie Aliase, die in Ihrer .bashrc-Datei definiert sind, nicht ausführen können, da dies ebenfalls keine ausführbaren Dateien sind.

Es ist hilfreich, sich daran zu erinnern, dass "einen Befehl ausführen" nicht "diesen Shell-Befehl ausführen" bedeutet, sondern vielmehr "diese ausführbare Datei ausführen". Wenn es sich nicht um eine ausführbare Datei handelt, können Sie sie nicht ausführen.

4voto

Matthew Flaschen Punkte 266507

Es ist ein eingebautes Gerät. Im Allgemeinen können Sie Built-Ins ausführen, indem Sie die Shell manuell aufrufen:

`bash -c 'history'`

In diesem Fall wird dies jedoch wahrscheinlich nicht sinnvoll sein.

0voto

Reactormonk Punkte 20960
{~}  which history
history: shell built-in command

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X