說我有:生成警告時,在bash命令執行時,在路的多個可執行文件
>which -a foo
/bin/foo
/usr/bin/foo
我想是這樣的:
>foo
Warning: multiple foo in PATH
... foo gets executed ...
此功能會真的今天很多時間救了我。 我應該猜到這種情況在早些時候發生,但問題並不清楚 在開始時對我而言,我開始朝相反的方向挖掘。
說我有:生成警告時,在bash命令執行時,在路的多個可執行文件
>which -a foo
/bin/foo
/usr/bin/foo
我想是這樣的:
>foo
Warning: multiple foo in PATH
... foo gets executed ...
此功能會真的今天很多時間救了我。 我應該猜到這種情況在早些時候發生,但問題並不清楚 在開始時對我而言,我開始朝相反的方向挖掘。
那麼,你可以這樣做,但這並不像你想像的那麼容易。
首先,您需要創建一個函數來檢查PATH中的所有目錄,並查看您嘗試運行的命令。 然後,您需要將此函數綁定到當前shell的DEBUG陷阱。
我寫了一個小腳本,它是:
$ 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
使用示例:
$ . /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
$
這是可能的,雖然有點技巧一般化。看到我的回答https://unix.stackexchange.com/q/42579/20437爲history
和PROMPT_COMMAND
魔法。你的checkSanity函數看起來是這樣的:
checkSanity() {
cmd="${1%% *}" # strip everything but the first word
candidates=$(which -a $cmd | wc -l)
if ((candidates > 1)); then
echo "Warning: multiple $cmd in PATH"
fi
}
但是,這將在命令完成後打印警告,而不是在開始時。使用DEBUG陷阱來獲得想要的結果:
trap 'checkSanity "$BASH_COMMAND"' DEBUG
據我可以理解,PROMPT_COMMAND不會在這裏幫助;它在你進入命令行之前執行,而不是在之後執行。 – 2012-07-11 13:10:39
它可以工作,但在命令結束後您會收到警告。 DEBUG陷阱在這方面更具多功能性。 – lynxlynxlynx 2012-07-11 13:24:10
就是這樣;這個歷史觀念也不太好,因爲它有副作用;你不想總是保存你的歷史。爲什麼你不想檢查歷史輸出? – 2012-07-11 13:35:09
而不是迭代'$ PATH',你可以使用'type -pa「$ 1」'。你也許可以使用'$ BASH_COMMAND'而不是解析'history'。 'preexec'函數必須在另一個上下文中起作用,但在這裏是無關緊要的。 – 2012-07-11 14:29:10
哦,我想我會通過電子郵件通知問題的答案。 **謝謝。**我想簡短的回答是「使用DEBUG陷阱」),因爲其他的東西是更明顯的bash mashinery。在這方面你的回答和@lynxlynxlynx都是很好的答案。儘管如此,我還是贊成你的回答,沒有其他原因。 – nshy 2012-07-17 09:20:43