Script with -e command line option?

If I type in the following example from “Programming Ruby”, I get an
error:

$ ruby -n -e “print if /wombat/” *.txt
-e:1: No such file or directory - if (Errno::ENOENT)

This is from a BASH command line on a linux system with ruby 1.8.4

At first I thought it was a problem with BASH interfering with quoting
or something, but I’ve tried many variations with no luck. Any idea?

thanks,

–su

Suresh U. schrieb:

If I type in the following example from “Programming Ruby”, I get an
error:

$ ruby -n -e “print if /wombat/” *.txt
-e:1: No such file or directory - if (Errno::ENOENT)

This is from a BASH command line on a linux system with ruby 1.8.4

My answer is from Windows 2000, Ruby 1.8.5, but the reason may be, that
there is
no file in your directory which mathes “*.txt”

Example from Windows Console >>>>>

C:\Dokumente und Einstellungen\wolfgang\Desktop>type otto.txt
Hello, world!

I’m here to wombat all thinks,
whatever wombat means…
C:\Dokumente und Einstellungen\wolfgang\Desktop>ruby -n -e “print if
/wombat/” *.txt
I’m here to wombat all thinks,
whatever wombat means…

EoE >>>>>

Wolfgang Nádasi-Donner

Wolfgang Nádasi-donner wrote:

My answer is from Windows 2000, Ruby 1.8.5, but the reason may be, that
there is
no file in your directory which mathes “*.txt”

no, that’s not my problem. oh - but this reminds me that if i just use
something like “print” for the command line command, then it works fine:

$ ls *.txt
test.txt

$ more test.txt
I wish I had a fish.
I wish I had a wombat.
Fish are tasty.
Wombats are tasty too.

$ ruby -n -e “print if /wombat/” *.txt
-e:1: No such file or directory - if (Errno::ENOENT)

$ ruby -n -e “print if /wombat/” test.txt
-e:1: No such file or directory - if (Errno::ENOENT)

$ ruby -n -e “print” test.txt
I wish I had a fish.
I wish I had a wombat.
Fish are tasty.
Wombats are tasty too.

$ ruby -n -e “print” if test.txt
-e:1: No such file or directory - if (Errno::ENOENT)

so it seems clear that ruby isn’t getting the entire -e argument,
probably due to intereference by BASH. anyone know how to fix this?

–su

On Jan 26, 2007, at 4:55 PM, Wolfgang Nádasi-Donner wrote:

Example from Windows Console >>>>>

EoE >>>>>

Wolfgang Nádasi-Donner

I suspect Wolfgang is correct. The output that I get is:

$ ruby -n -e “print if /wombat/” *.txt
-e:1: No such file or directory - *.txt (Errno::ENOENT)

Are you copying the exact message? It’s odd that it thinks “if” is
the name. When the file exists it appears to do what you probably
expected.

$ ls
README app config doc log script tmp
Rakefile components db lib public test vendor
$ ruby -n -e “print if /wombat/” README*
$ ruby -n -e “print if /Congratulations/” README*
2. Go to http://localhost:3000/ and get “Congratulations, you’ve put
Ruby on Rails!”
3. Follow the guidelines on the “Congratulations, you’ve put Ruby on
Rails!” screen

Sorry, I didn’t make a new .txt file, but just used what was handy.

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

On 26.01.2007 23:08, Suresh U. wrote:

-e:1: No such file or directory - if (Errno::ENOENT)
so it seems clear that ruby isn’t getting the entire -e argument,
probably due to intereference by BASH. anyone know how to fix this?

This looks like “ruby” was a shell script that does not properly quote
arguments because ruby thinks the first word after “print” is a file
name. Here you can see the effect:

robert@fussel ~
$ ./aa -n -e “print if /wombat/” *.txt
-e:1: No such file or directory - if (Errno::ENOENT)

robert@fussel ~
$ cat aa
#!/bin/sh -f

ruby $*

robert@fussel ~
$

Kind regards

robert

On Friday 26 January 2007 17:08, Suresh U. <Suresh U.
[email protected]> wrote:

test.txt
$ ruby -n -e “print if /wombat/” test.txt
-e:1: No such file or directory - if (Errno::ENOENT)

jab3:~% cat > wombat.txt
I wish I had a fish.
I wish I had a wombat.
Fish are tasty.
Wombats are tasty too.
jab3:~% ruby -n -e “print if /wombat/” *.txt
I wish I had a wombat.
jab3:~%

Something is screwy with your setup. Note that it is complaining that
the file ‘if’ doesn’t exist. You could try something like this and see
if it works:

ruby -n -e “$stdout.print if /wombat/” *.txt

Why it thinks that ‘if’ should be a file I’m not sure about.

-jab3

On Jan 26, 2007, at 5:08 PM, Suresh U. wrote:

$ ruby -n -e “print” if test.txt
-e:1: No such file or directory - if (Errno::ENOENT)

so it seems clear that ruby isn’t getting the entire -e argument,
probably due to intereference by BASH. anyone know how to fix this?

–su

Well, the first thing to try is changing the kind of quotes.

$ ruby -n -e ‘print if /wombat/’ test.txt

If that doesn’t work, I’d start to suspect that you have “ruby”
defined as an alias or something to make the args be evaluated twice.

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

Robert K. wrote:

This looks like “ruby” was a shell script that does not properly quote
arguments

Rob B. wrote:

I’d start to suspect that you have “ruby”
defined as an alias or something to make the args be evaluated twice.

Turns out that this was indeed the problem. When I started using the
ruby fltk extensions, I found that I had to replace /usr/bin/ruby with
the following script:

#!/bin/bash

export LD_ASSUME_KERNEL=2.3.98
exec /usr/bin/ruby1.8 $*

so that’s why the arguments were being evaluated twice.

thanks everyone for your help!

–su

On 27.01.2007 20:13, Suresh U. wrote:

the following script:

#!/bin/bash

export LD_ASSUME_KERNEL=2.3.98
exec /usr/bin/ruby1.8 $*

so that’s why the arguments were being evaluated twice.

thanks everyone for your help!

You can easily fix that script with this line which will do proper
quoting:

exec /usr/bin/ruby1.8 “$@”

Kind regards

robert

Suresh U. [email protected] writes:

the following script:

#!/bin/bash

export LD_ASSUME_KERNEL=2.3.98
exec /usr/bin/ruby1.8 $*

so that’s why the arguments were being evaluated twice.

thanks everyone for your help!

I would recommend that you do this in your script:

#!/bin/bash

export LD_ASSUME_KERNEL=2.3.98
exec /usr/bin/ruby1.8 “$@”

The “$@” construct will help to maintain the quoting of the arguments
which are passed in.

For example:

script1

#!/bin/bash
for arg in $*
do
echo arg=$arg
done

script2

#!/bin/bash
for arg in “$@”
do
echo arg=$arg
done

% chmod +x script1 script2
% ./script1 “this is the first arg” “this is the second arg”
arg=this
arg=is
arg=the
arg=first
arg=arg
arg=this
arg=is
arg=the
arg=second
arg=arg
% ./script2 “this is the first arg” “this is the second arg”
arg=this is the first arg
arg=this is the second arg