I just spotted this in the README.Debian that Debian supply with Bash: bash does not check $PATH if hash fails
bash hashes the location of recently executed commands. When a command is moved to a new location in the PATH, the command is still in the PATH but the hash table still records the old location. For performance reasons bash does not remove the command from the hash and relook it up in PATH. "For performance reasons"?!? The only way I can parse that is as claiming it's better to complain 'No such file or directory' than it is to run the command that the user asked for (and is in the path) because the former is faster. Really, do you expect me to buy that? Is that actually going to be useful to anybody? Use 'hash -r' manually or set a bash option: 'shopt -s checkhash'. Options make sense when different users genuinely have different preferences, not to make up for stupidities in your default behaviour. Smylers