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

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

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

system 'sh -c history'

however there really won't be one since the invocation of sh immediately
exits.

you may find my session lib helpful

   require 'session' # gem install session

   sh = Session::SH.new

   stdout, stderr = sh.execute 'ls'
   p sh.status

   stdout, stderr = sh.execute 'history' # this will have 'ls' in it!
   p sh.status

regards.

-a

···

On Thu, 10 Aug 2006, 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

--
to foster inner awareness, introspection, and reasoning is more efficient than
meditation and prayer.
- h.h. the 14th dali lama

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

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

···

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

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

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

that's because each call starts a __new__ shell so you won't have any history!

see my post about session.

-a

···

On Thu, 10 Aug 2006, Morton Goldberg wrote:

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.

--
to foster inner awareness, introspection, and reasoning is more efficient than
meditation and prayer.
- h.h. the 14th dali lama

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

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.

Thanks

Yeah, that's probably not it. Sorry.

-Justin

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

Kind regards

  robert

···

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.

# 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

Kind regards

        robert