Problems with accessing directory defined in ENV variables

Ruby is giving me pure hell trying to access directories on a mounted
drive. Our network puts certain files on a temporary drive defined in
our .profile file I'm running HP UX/11).

If I ask for puts ENV['TMPDIR'], it knows what the pathway is (i.e. it
gives /TEMP2002/t3905).

If I issue a system command `echo $TMPDIR`, it also gives the right
answer.

However, if I try to change to that directory with a command such as
Dir.chdir(" #{ENV['TMPDIR']} " ), I always get errors like this:

./isf_spectrum.rb:1094:in `chdir': No such file or directory -
/TEMP2002/t3905 (Errno::ENOENT)
        from ./isf_spectrum.rb:1094

I've also just tried to define a pathway explicitly as
"/TEMP2002/t3905", and the same error results. If I directly say "cd
$TMPDIR" in UNIX, I go right there. I've been trying everything for a
couple of hours, and I'm getting nowhere.

What is going on here? Why can't I change to a directory that Ruby can
point out clearly?

···

--
Posted via http://www.ruby-forum.com/.

There are extra spaces at the start and end of the double-quoted string.
Could that be the trouble? m.

···

Thomas Luedeke <thomas.luedeke@areva.com> wrote:

However, if I try to change to that directory with a command such as
Dir.chdir(" #{ENV['TMPDIR']} " ),

--
matt neuburg, phd = matt@tidbits.com, Matt Neuburg’s Home Page
Leopard - http://www.takecontrolbooks.com/leopard-customizing.html
AppleScript - http://www.amazon.com/gp/product/0596102119
Read TidBITS! It's free and smart. http://www.tidbits.com

You don’t need the quotes, you can just do:

    Dir.chdir(ENV['TMPDIR'])

···

On Tue Aug 12 06:46:26 2008, Thomas Luedeke wrote:

Ruby is giving me pure hell trying to access directories on a mounted
drive. Our network puts certain files on a temporary drive defined in
our .profile file I'm running HP UX/11).

If I ask for puts ENV['TMPDIR'], it knows what the pathway is (i.e. it
gives /TEMP2002/t3905).

If I issue a system command `echo $TMPDIR`, it also gives the right
answer.

However, if I try to change to that directory with a command such as
Dir.chdir(" #{ENV['TMPDIR']} " ), I always get errors like this:

--
Fred O. Phillips

BBC7 7572 755F 83E0 3209 504A E4F7 874F 1545 9D41

matt neuburg wrote:

···

Thomas Luedeke <thomas.luedeke@areva.com> wrote:

However, if I try to change to that directory with a command such as
Dir.chdir(" #{ENV['TMPDIR']} " ),

There are extra spaces at the start and end of the double-quoted string.
Could that be the trouble? m.

Well, I do get a different (if not less enigmatic) error:

test.rb:5: warning: Insecure world writable dir /TEMP2002 in PATH, mode
040777
/usr/bin/cd[7]: /TEMP2002/T3905/: not found.
--
Posted via http://www.ruby-forum.com/\.

Fred Phillips wrote:

···

On Tue Aug 12 06:46:26 2008, Thomas Luedeke wrote:

However, if I try to change to that directory with a command such as
Dir.chdir(" #{ENV['TMPDIR']} " ), I always get errors like this:

You don’t need the quotes, you can just do:

    Dir.chdir(ENV['TMPDIR'])

Whew - that did it. Thanks so much - that is a serious load off my
back.

Just for my newbie education, what was going wrong with what I was
doing? What was Ruby thinking I was asking for??
--
Posted via http://www.ruby-forum.com/\.

Your first example would expand to " /TEMP2002/t3905 " not
"/TEMP2002/t3905" like you wanted. I think in your second example you
still had the space immediately after the " (" #{ENV['TMPDIR']}")

···

On Tue Aug 12 08:06:45 2008, Thomas Luedeke wrote:

Fred Phillips wrote:
> On Tue Aug 12 06:46:26 2008, Thomas Luedeke wrote:
>> However, if I try to change to that directory with a command such as
>> Dir.chdir(" #{ENV['TMPDIR']} " ), I always get errors like this:
>
> You don’t need the quotes, you can just do:
>
> Dir.chdir(ENV['TMPDIR'])

Whew - that did it. Thanks so much - that is a serious load off my
back.

Just for my newbie education, what was going wrong with what I was
doing? What was Ruby thinking I was asking for??

--
Fred O. Phillips

BBC7 7572 755F 83E0 3209 504A E4F7 874F 1545 9D41

You made things more complicated than necessary - probably because of
a shell programming background. In a shell it is a good idea to
enclose every variable expansion in double quotes because this will
prevent issues with whitespace in variable values. Ruby works quite
differently and the expression ENV['TMPDIR'] yields a single string -
even if there are spaces in $TMPDIR.

But since you choose to employ string interpolation, the result of the
expression in #{} was incorporated into the string, which happened to
have whitespace at the front and rear. Thus the resulting string also
had whitespace at the front and read and that path does not exist on
your filesystem. You can easily see it by doing

ruby -e 'p " #{ENV['TMPDIR']} "'

HTH

Kind regards

robert

···

On 12 Aug., 01:06, Thomas Luedeke <thomas.lued...@areva.com> wrote:

Fred Phillips wrote:
> On Tue Aug 12 06:46:26 2008, Thomas Luedeke wrote:
>> However, if I try to change to that directory with a command such as
>> Dir.chdir(" #{ENV['TMPDIR']} " ), I always get errors like this:

> You don’t need the quotes, you can just do:

> Dir.chdir(ENV['TMPDIR'])

Whew - that did it. Thanks so much - that is a serious load off my
back.

Just for my newbie education, what was going wrong with what I was
doing? What was Ruby thinking I was asking for??

Robert Klemme wrote:

back.

Just for my newbie education, what was going wrong with what I was
doing? ?What was Ruby thinking I was asking for??

You made things more complicated than necessary - probably because of
a shell programming background. In a shell it is a good idea to
enclose every variable expansion in double quotes because this will
prevent issues with whitespace in variable values. Ruby works quite
differently and the expression ENV['TMPDIR'] yields a single string -
even if there are spaces in $TMPDIR.

But since you choose to employ string interpolation, the result of the
expression in #{} was incorporated into the string, which happened to
have whitespace at the front and rear. Thus the resulting string also
had whitespace at the front and read and that path does not exist on
your filesystem. You can easily see it by doing

ruby -e 'p " #{ENV['TMPDIR']} "'

HTH

Kind regards

robert

Admittedly, I'm having a terrible time understanding what Ruby wants
with respect to parentheses, #{} constructs, and the like. It's very
confusing.

My scripts are a horrible mess because I can't get things to work
consistently, and almost every time I refer to a variable, a directory,
or a file, I have to write a mini-script just to figure out what it
wants. It sucks.

···

On 12 Aug., 01:06, Thomas Luedeke <thomas.lued...@areva.com> wrote:

--
Posted via http://www.ruby-forum.com/\.

Admittedly, I'm having a terrible time understanding what Ruby wants with respect to parentheses, #{} constructs, and the like. It's very confusing.

Maybe then you should read through some introductory material.

My scripts are a horrible mess because I can't get things to work consistently, and almost every time I refer to a variable, a directory, or a file, I have to write a mini-script just to figure out what it wants. It sucks.

You can use IRB for that. And as I said: do not try to write Ruby programs like shell scripts. These are two completely different pairs of shoes.

Kind regards

  robert

···

On 12.08.2008 18:15, Thomas Luedeke wrote:

Admittedly, I'm having a terrible time understanding what Ruby wants
with respect to parentheses, #{} constructs, and the like. It's very
confusing.

Here's a short summary of how those things are used in ruby. I hope you'll
find it useful:
- parentheses: they have two uses:
* method calls: when you call a method, you put its arguments in parentheses,
taking care not to put spaces between the method name and the parentheses. If
you want, you can usually (but not always), omit parentheses in this case
* grouping, like in 2 * (3 + 2 )
- double quotes (""): they are the delimiters of double quoted strings. In
this kind of string, string interpolation (that is, the #{} construct) happens
and the backslash (\) character has a special meaning (see the table
"Substitutions in double-quoted strings" in http://www.ruby-
doc.org/docs/ProgrammingRuby/html/language.html). If you need to put a double
quote character inside a double quoted string, you need to prefix it with a
backslash, this way: "a \"double quoted\" string"
- single quotes (''): they are the delimiters of single quoted strings, where
string interpolation doesn't happen and the backslash has no special meaning,
except when it precedes a single quote (in this case, it allows to insert a
literal single quote into the string)
- string interpolation (#{}): delimits a piece of ruby code embedded in a
double-quoted string. The code is run and the value it returns is put in the
string in place of the code itself. (Note that this happens as the string is
created, it can't be delayed)

NOTE: technically, single-quoted and double-quoted strings are not two
different strings, but different kinds of string literals, that is two
different ways of writing a string in your program.

If the summary above doesn't help you, you can try looking at the "Programming
ruby", whose first edition is freely availlable online
(Programming Ruby: The Pragmatic Programmer's Guide), expecially at the chapter
"The Ruby Language", and ask specific question on those things which confuse
you here.

My scripts are a horrible mess because I can't get things to work
consistently, and almost every time I refer to a variable, a directory,
or a file, I have to write a mini-script just to figure out what it
wants.

If you need to test short pieces of code, you can use irb.

Stefano

···

On Tuesday 12 August 2008, Thomas Luedeke wrote: