Vâng, bạn có thể làm điều đó, nhưng nó không phải là quá dễ dàng như bạn có thể nghĩ.
Trước tiên, bạn cần tạo một hàm sẽ kiểm tra tất cả các thư mục trong PATH và tìm ở đó cho lệnh bạn cố gắng chạy. Sau đó, bạn cần phải liên kết hàm này với bẫy DEBUG của trình bao hiện tại của bạn.
Tôi đã viết một kịch bản nhỏ nào đó:
$ 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
Ví dụ về sử dụng:
$ . /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
$
Nguồn
2012-07-11 13:08:03
Thay vì lặp qua '$ PATH', bạn có thể sử dụng' type -pa "$ 1" '. Ngoài ra, bạn có thể sử dụng '$ BASH_COMMAND' thay vì phân tích cú pháp' lịch sử'. Hàm 'preexec' phải phục vụ một mục đích trong ngữ cảnh khác, nhưng nó không liên quan ở đây. –
Ồ, tôi nghĩ tôi sẽ được thông báo bằng email về câu trả lời cho câu hỏi. ** Cảm ơn bạn. ** Tôi đoán câu trả lời ngắn sẽ là "sử dụng bẫy DEBUG") như những thứ khác là rõ ràng hơn bash mashinery. Về vấn đề này câu trả lời của bạn và @lynxlynxlynx một là cả hai tốt nhất. Tuy nhiên, tôi bình chọn của bạn như là câu trả lời chỉ trên đầu trang, không có lý do khác. – nshy