Excellent. That explains why the pipe made it work. Thanks! - DAP
> -----Original Message----- > From: Jeff Westman [mailto:[EMAIL PROTECTED] > Sent: Friday, June 27, 2003 11:04 AM > To: beginners > Subject: Re: using whence > > > > David Parker wrote: > > > Hi. I have a perl script that calls various programs. I > would like to be > > able to verify that a given program is being called from > the right place - > > what I would use "whence" for in the korn shell. > > > > > > I tried > > > > > > $path = `whence $cmdname`; > > > > > > but I don't get anything in $path. I'm undoubtedly > missing something - > > I'm a beginner! > > > > > > Thanks in advance for any clues.... > > > > There's no 'whence' command in ksh that I know of... I > think you want > > 'which' > > > > -- Brett > > > http://www.chapelperilous.net/ > > I recently asked this question myself on another "builtin" > ksh command. > Steve, a regular contributer to this list told me the reason > why my 'set' > would not work: > > === begin cut ====================================================== > Actually, the shell isn't involved at all. Since there are no shell > metacharacters in the string "set", perl tries to exec "set" directly, > using the C library function execvp(), which uses $PATH. > > $ strace -f perl -e 'qx(set)' 2>&1 |grep exec > execve("/usr/bin/perl", ["perl", "-e", "qx(set)"], [/* 22 > vars */]) = 0 > [pid 10527] execve("/bin/set", ["set"], [/* 22 vars */]) > = -1 ENOENT > [pid 10527] execve("/usr/bin/set", ["set"], [/* 22 vars > */]) = -1 ENOENT > [pid 10527] execve("/usr/X11R6/bin/set", ["set"], [/* 22 > vars */]) = -1 > ENOENT > [pid 10527] execve("/opt/bin/set", ["set"], [/* 22 vars > */]) = -1 ENOENT > > If you add a shell metacharacter, then perl will use the shell: > > $ strace -f perl -e 'qx(set;)' 2>&1 |grep exec > execve("/usr/bin/perl", ["perl", "-e", "qx(set;)"], [/* > 22 vars */]) = 0 > [pid 10594] execve("/bin/sh", ["sh", "-c", "set;"], [/* > 22 vars */]) = 0 > > The same thing goes for system(), which is where this subtlety > is documented. > > $ perldoc -f system > === end cut ======================================================== > > So, in order to force the shell to be called using a builtin > such as "whence" > or "set", simply add a ';' to the end of your string: > > #!/bin/perl > use strict; > use warnings; > my $cmdname = "date"; > my $path = `whence $cmdname;`; # note the embedded ';' > print "path - $path\n"; > > And BTW, "which" checks your path only... "whence" checks the > to see if the > command is a builtin, a function, an alias (and finally) the > path. "which" > only checks the path.... > > -Jeff > > __________________________________ > Do you Yahoo!? > SBC Yahoo! DSL - Now only $29.95 per month! > http://sbc.yahoo.com > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]