[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

access built-in shell commands like 'history' or 'fc'

bwv549

8/9/2006 7:29:00 PM

How do I access built-in shell commands (like 'history' or 'fc') with a
system call?

Not what I was expecting:
% ruby -e 'puts `history`'
-e:1: command not found: history

But this works fine:

% ruby -e 'puts `pwd`'
/home/john

I've tried this:

% ruby -e 'system "history >tmp.tmp"; puts IO.read("tmp.tmp")'

And no errors are generated, but there is nothing in tmp.tmp, either.

Thanks

9 Answers

Justin Collins

8/9/2006 7:36:00 PM

0

bwv549 wrote:
> How do I access built-in shell commands (like 'history' or 'fc') with a
> system call?
>
> Not what I was expecting:
> % ruby -e 'puts `history`'
> -e:1: command not found: history
>
> But this works fine:
>
> % ruby -e 'puts `pwd`'
> /home/john
>
> I've tried this:
>
> % ruby -e 'system "history >tmp.tmp"; puts IO.read("tmp.tmp")'
>
> And no errors are generated, but there is nothing in tmp.tmp, either.
>
> Thanks
Could it be that Ruby is using a different shell than you are used to?
I think it uses /bin/sh by default (not sure).

-Justin

Ara.T.Howard

8/9/2006 7:46:00 PM

0

bwv549

8/9/2006 7:52:00 PM

0

> Could it be that Ruby is using a different shell than you are used to?
> I think it uses /bin/sh by default (not sure).

Perhaps that is part of it. However, on this suggestion, I entered the
suggested shell (/bin/sh). However, the behavior hasn't changed,
although the 'history' command works fine in this shell.

Just for reference, this is what I get when checking what this shell
is:

% /bin/sh --version
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

I'm on Ubuntu 6.X, just for reference.

Thanks

Morton Goldberg

8/10/2006 12:23:00 AM

0

Why not access them by reading the file ~/.bash-history?

Regards, Morton

On Aug 9, 2006, at 3:30 PM, bwv549 wrote:

> How do I access built-in shell commands (like 'history' or 'fc')
> with a
> system call?
>
> Not what I was expecting:
> % ruby -e 'puts `history`'
> -e:1: command not found: history
>
> But this works fine:
>
> % ruby -e 'puts `pwd`'
> /home/john
>
> I've tried this:
>
> % ruby -e 'system "history >tmp.tmp"; puts IO.read("tmp.tmp")'
>
> And no errors are generated, but there is nothing in tmp.tmp, either.
>
> Thanks
>
>


Ara.T.Howard

8/10/2006 12:29:00 AM

0

Robert Klemme

8/10/2006 10:05:00 AM

0

On 09.08.2006 21:51, bwv549 wrote:
>> Could it be that Ruby is using a different shell than you are used to?
>> I think it uses /bin/sh by default (not sure).
>
> Perhaps that is part of it. However, on this suggestion, I entered the
> suggested shell (/bin/sh). However, the behavior hasn't changed,
> although the 'history' command works fine in this shell.
>
> Just for reference, this is what I get when checking what this shell
> is:
>
> % /bin/sh --version
> GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)
> Copyright (C) 2005 Free Software Foundation, Inc.
>
> I'm on Ubuntu 6.X, just for reference.

There is really no point in accessing the history of the shell because
what you likely want is the history of the *invoking* shell, i.e. the
one that started your ruby interpreter. AFAIK there is no way to access
that history. If you want to work with that you can do this at the
shell prompt.

history | ruby -e '...'

Your example with "pwd" worked because "pwd" is also an external program
(try it out with "type -a pwd"). But you can access PWD much easier
from inside Ruby:

12:03:59 [~]: ruby -e 'puts Dir.pwd, ENV["PWD"]'
/cygdrive/w
/cygdrive/w

Kind regards

robert

x1

8/11/2006 12:51:00 AM

0

# if HISTFILE is in rbconfig

ruby -e 'IO.read(ENV["HISTFILE"]).split.each {|i| puts i}'
# else
ruby -e 'IO.read(ENV["HOME"] + "/.bash_history").split.each {|i| puts i}'


On 8/10/06, Robert Klemme <shortcutter@googlemail.com> wrote:
> On 09.08.2006 21:51, bwv549 wrote:
> >> Could it be that Ruby is using a different shell than you are used to?
> >> I think it uses /bin/sh by default (not sure).
> >
> > Perhaps that is part of it. However, on this suggestion, I entered the
> > suggested shell (/bin/sh). However, the behavior hasn't changed,
> > although the 'history' command works fine in this shell.
> >
> > Just for reference, this is what I get when checking what this shell
> > is:
> >
> > % /bin/sh --version
> > GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)
> > Copyright (C) 2005 Free Software Foundation, Inc.
> >
> > I'm on Ubuntu 6.X, just for reference.
>
> There is really no point in accessing the history of the shell because
> what you likely want is the history of the *invoking* shell, i.e. the
> one that started your ruby interpreter. AFAIK there is no way to access
> that history. If you want to work with that you can do this at the
> shell prompt.
>
> history | ruby -e '...'
>
> Your example with "pwd" worked because "pwd" is also an external program
> (try it out with "type -a pwd"). But you can access PWD much easier
> from inside Ruby:
>
> 12:03:59 [~]: ruby -e 'puts Dir.pwd, ENV["PWD"]'
> /cygdrive/w
> /cygdrive/w
>
> Kind regards
>
> robert
>
>

Ken Bloom

8/11/2006 2:26:00 PM

0

On Wed, 09 Aug 2006 12:28:44 -0700, bwv549 wrote:

> How do I access built-in shell commands (like 'history' or 'fc') with a
> system call?
>
> Not what I was expecting:
> % ruby -e 'puts `history`'
> -e:1: command not found: history
>
> But this works fine:
>
> % ruby -e 'puts `pwd`'
> /home/john
>
> I've tried this:
>
> % ruby -e 'system "history >tmp.tmp"; puts IO.read("tmp.tmp")'
>
> And no errors are generated, but there is nothing in tmp.tmp, either.
>
> Thanks

I think under certain circumstances either ruby doesn't call the shell
(and just calls the executable) or the shell doesn't recognize builtin
commands when called as sh -c

For example:
irb(main):001:0> puts `cd scratch`
(irb):1: command not found: cd scratch

=> nil
irb(main):002:0> puts `pwd`
/home/bloom
=> nil
irb(main):003:0> puts `type pwd`
(irb):3: command not found: type pwd

=> nil
irb(main):004:0> puts `type pwd && echo`
pwd is a shell builtin

=> nil
irb(main):005:0> puts `which pwd`
/bin/pwd
=> nil

pwd works because it also happens to be a binary in /bin

--Ken Bloom

--
Ken Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu...

Matthias Ludwig

8/11/2006 2:42:00 PM

0

> I think under certain circumstances either ruby doesn't call the shell
> (and just calls the executable) or the shell doesn't recognize builtin
> commands when called as sh -c

that's it.
The most shells provide build-in commands only in the interactive mode.
Some shells coIMost shells print something like "can't find...", some
shells also print a littl help.

example (on zsh):

$ echo history | zsh
history: not interactive shell

regards,
Matthias