bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Ensure the command found in the hash table exists, not only on P


From: Giuseppe Scrivano
Subject: [PATCH] Ensure the command found in the hash table exists, not only on POSIXLY_CORRECT
Date: Thu, 07 Jan 2010 14:39:35 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.90 (gnu/linux)

Hello,

what do you think about make this the default behavior, not only when
POSIXLY_CORRECT is specified?  A `stat' is very fast, the cost of a
stat+fork+exec is almost the same of a fork+exec.

This is the test case I used, I expect to get "hello world" twice:

--------------------------------------------
export PATH=a:b:$PATH
cd /tmp
mkdir a b
cat > a/prog.sh << EOF
echo hello world
EOF
chmod +x a/prog.sh
cp a/prog.sh b/prog.sh

prog.sh

rm a/prog.sh

prog.sh
--------------------------------------------


It works with "POSIXLY_CORRECT=1 bash" and dash handles it too.  Without
POSIXLY_CORRECT I get:

hello world
/tmp/failure.sh: line 13: a/prog.sh: No such file or directory



I have a question: how bash should behave in the case you have:

-------------------------------------------
export PATH=a:b:$PATH

mkdir a b

cat > b/prog.sh << EOF
echo b/prog.sh
EOF

chmod +x b/prog.sh

prog.sh

cat > a/prog.sh << EOF
echo a/prog.sh
EOF

chmod +x a/prog.sh

prog.sh
-------------------------------------------


Which prog.sh should be used in this case?  a/prog.sh or b/prog.sh?  The
former has a higher precedence in PATH but the latter is the hashed
value.

Thanks,
Giuseppe Scrivano



>From c786059d65fc47d6265ebde3fe88c18c381dc77b Mon Sep 17 00:00:00 2001
From: Giuseppe Scrivano <gscrivano@gnu.org>
Date: Thu, 7 Jan 2010 13:52:13 +0100
Subject: [PATCH] Ensure the command found in the hash table exists, not only on 
POSIXLY_CORRECT

---
 findcmd.c |   19 +++++++------------
 1 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/findcmd.c b/findcmd.c
index 1f05394..b8c4fbe 100644
--- a/findcmd.c
+++ b/findcmd.c
@@ -301,18 +301,13 @@ search_for_command (pathname)
     hashed_file = phash_search (pathname);
 
   /* If a command found in the hash table no longer exists, we need to
-     look for it in $PATH.  Thank you Posix.2.  This forces us to stat
-     every command found in the hash table. */
-
-  if (hashed_file && (posixly_correct || check_hashed_filenames))
-    {
-      st = file_status (hashed_file);
-      if ((st & (FS_EXISTS|FS_EXECABLE)) != (FS_EXISTS|FS_EXECABLE))
-       {
-         phash_remove (pathname);
-         free (hashed_file);
-         hashed_file = (char *)NULL;
-       }
+     look for it in $PATH.  */
+  st = file_status (hashed_file);
+  if ((st & (FS_EXISTS|FS_EXECABLE)) != (FS_EXISTS|FS_EXECABLE))
+         {
+           phash_remove (pathname);
+           free (hashed_file);
+           hashed_file = (char *)NULL;
     }
 
   if (hashed_file)
-- 
1.6.5





reply via email to

[Prev in Thread] Current Thread [Next in Thread]