Eh, bunu yapabilirsiniz, ancak düşündüğünüzden kadar kolay değildir: istenilen sonucu elde etmek için yerine DEBUG tuzağı kullanın. İlk olarak, PATH'daki tüm dizinleri denetleyecek bir işlev oluşturmanız ve çalışmaya çalıştığınız komut için oraya bakmanız gerekir. Ardından bu işlevi geçerli kabuğunuzun DEBUG tuzağına bağlamanız gerekir. kullanım
$ cat /tmp/1.sh
check_command()
{
n=0
DIRS=""
for i in $(echo $PATH| tr : " ")
do
if [ -x "$i/$1" ]
then
n=$[n+1]
DIRS="$DIRS $i"
fi
done
if [ "$n" -gt 1 ]
then
echo "Warning: there are multiple commands in different PATH directories: "$DIRS
fi
}
preexec() {
check_command $1
}
preexec_invoke_exec() {
[ -n "$COMP_LINE" ] && return # do nothing if completing
local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG
Örnek:
Bunu yapan bir küçük senaryo yazdı, PROMPT_COMMAND burada yardımcı olmaz bildiğim kadarıyla anlayabileceği şekilde
$ . /tmp/1.sh
$ sudo cp /bin/date /usr/bin/test_it
$ sudo cp /bin/date /bin/test_it
$ test_it
Warning: there are multiple commands in different PATH directories: /usr/bin /bin
Wed Jul 11 15:14:43 CEST 2012
$
"$ PATH" üzerinde yineleme yerine, 'type -pa" $ 1 "' yi kullanabilirsiniz. Ayrıca 'history''i ayrıştırmak yerine' $ BASH_COMMAND' kullanabilirsiniz. 'Preexec' işlevi başka bir bağlamda bir amaca hizmet etmelidir, ancak buradaki yabancıdır. –
Ohh, soruya verilen cevaplarda e-posta ile bilgilendirileceğini düşündüm. ** Teşekkürler. ** Sanırım diğer şeyler daha bariz bash mashinery olduğu gibi kısa cevap "DEBUG tuzak kullanın" olacaktır. Bu bakımdan cevabın ve @lynxlynxlynx birinin de iyi biri. Yine de, sizinki gibi cevaplarınızı sadece en üstte, başka hiçbir sebepten dolayı oylamıyorum. – nshy