tI agree with the race fix of JG, but I dislike the SUSV3-breaking find, and I don't care about PATH changes, keep it simple, stupid - dmenu - Dmenu fork with xft fonts.
 (HTM) git clone git://r-36.net/dmenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3a9f3a51ce25717813da7321d4771dca11a25af8
 (DIR) parent 53e92b5c1797ae5d259942b0a3f20a63c1a02f1e
 (HTM) Author: Anselm R. Garbe <arg@suckless.org>
       Date:   Thu, 24 May 2007 10:34:44 +0200
       
       I agree with the race fix of JG, but I dislike the SUSV3-breaking find, and I don't care about PATH changes, keep it simple, stupid
       Diffstat:
         dmenu_path                          |      34 ++++++++++++++++----------------
       
       1 file changed, 17 insertions(+), 17 deletions(-)
       ---
 (DIR) diff --git a/dmenu_path b/dmenu_path
       t@@ -1,26 +1,26 @@
       -#!/bin/sh -f
       +#!/bin/sh
        CACHE=$HOME/.dmenu_cache
        IFS=:
        
       -qfind() {
       -        find "$@" 2>/dev/null
       -}
       -
       -uptodate() {                                                                       
       -        test -f $CACHE &&
       -                test "$(echo "$PATH")" = "$(sed 1q "$CACHE")" &&
       -                ! qfind $PATH -maxdepth 0 -newer $CACHE >/dev/null
       +uptodate() {
       +        test ! -f $CACHE && return 1
       +        for dir in $PATH
       +        do
       +                test $dir -nt $CACHE && return 1
       +        done
       +        return 0
        }
        
        if ! uptodate
        then
       -        {
       -                echo "$PATH"
       -                qfind $PATH -type f -maxdepth 1 '(' -perm -u+x -o -perm -g+x -o -perm -o+x ')' |
       -                        sed 's,.*/,,' | sort | uniq
       -        }
       -        mv $CACHE.$pid $CACHE
       +        for dir in $PATH
       +        do
       +                for file in "$dir"/*
       +                do
       +                        test -x "$file" && echo "${file##*/}"
       +                done
       +        done | sort | uniq > $CACHE.$$
       +        mv $CACHE.$$ $CACHE
        fi
        
       -tail -n +2 $CACHE
       -
       +cat $CACHE