Đôi khi tôi định nghĩa một hàm làm mờ một tệp thực thi và điều chỉnh các đối số hoặc đầu ra của nó. Vì vậy, hàm có cùng tên với tệp thực thi và tôi cần một cách để chạy tệp thực thi từ hàm mà không gọi hàm đệ quy. Ví dụ: để tự động chạy đầu ra fossil diff
thông qua colordiff
và less -R
tôi sử dụng:
function fossil () {
local EX=$(which fossil)
if [ -z "$EX" ] ; then
echo "Unable to find 'fossil' executable." >&2
return 1
fi
if [ -t 1 ] && [ "$1" == "diff" ] ; then
"$EX" "$@" | colordiff | less -R
return
fi
"$EX" "$@"
}
Nếu tôi chắc chắn về vị trí thực thi, tôi có thể chỉ cần gõ /usr/bin/fossil
. Bash nhận ra điều đó /
có nghĩa là lệnh đó là một lệnh thực thi, không phải là hàm. Nhưng vì tôi không biết chính xác vị trí, tôi phải dùng đến cách gọi which
và kiểm tra kết quả. đó có phải là cách dễ hơn?
/
có nghĩa là lệnh là một lệnh thực thi, không phải là một chức năng. Nói một cách nghiêm túc, điều đó không đúng. Trong những gì tôi tin là một quyết định thiết kế khủng khiếp (và không có giấy tờ), bash cho phép các tên hàm chứa dấu gạch chéo. Các dấu gạch chéo chỉ đơn giản/usr/bin/fossil
là một chuỗi khác vớifossil
, vì vậy, khi bạn nói/usr/bin/fossil
, nó không cố chạyfossil
hàm.