In <[EMAIL PROTECTED]>, Dag-Erling Smørgrav <[EMAIL PROTECTED]> typed: > Mike Meyer <[EMAIL PROTECTED]> writes: > > In <[EMAIL PROTECTED]>, Dag-Erling Smørgrav <[EMAIL PROTECTED]> typed: > > > You got it the wrong way around. First pass argv[0] to realpath(3), > > > fall back to using $PATH only if realpath(3) fails (which it shouldn't > > > unless you've called chdir(2), chroot(2) or jail(2) earlier in the > > > process, or the executable was moved or removed) > > No, I got it the right way 'round. If the shell walks the PATH, then > > calling realpath(3) on argv[0] is the wrong thing to do, as it'll > > resolve the path relative to the pwd. > > but argv[0] is either an absolute path or a path relative to pwd, > unless your shell is broken. > > [EMAIL PROTECTED] ~% cat >bin/foo > #!/bin/sh > echo $0 $@ > [EMAIL PROTECTED] ~% chmod a+rx bin/foo > [EMAIL PROTECTED] ~% ./bin/foo > ./bin/foo > [EMAIL PROTECTED] ~% foo > /home/des/bin/foo
That's happening because sh does the path search on argv[0] (if it would have done it when you executed the command) and uses the result instead of argv[0] for $0. If you try it in C, it doesn't work: bhuda% cat >foo.c #include <stdio.h> main(int argc, char **argv) { printf("%s\n", argv[0]) ; } bhuda% cc foo.c -o bin/foo bhuda% ./bin/foo ./bin/foo bhuda% foo foo bhuda% Changing shells to /bin/sh or bin/csh doesn't change things. <mike -- Mike Meyer <[EMAIL PROTECTED]> http://www.mired.org/consulting.html Independent Network/Unix/Perforce consultant, email for more information. _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"