Kadang-kadang saya mendefinisikan fungsi yang membayangi yang dapat dieksekusi dan mengubah argumen atau outputnya. Jadi fungsinya memiliki nama yang sama dengan executable, dan saya perlu cara bagaimana menjalankan executable dari fungsi tanpa memanggil fungsi secara rekursif. Misalnya, untuk secara otomatis menjalankan output fossil diffmelalui colordiffdan less -Rsaya gunakan:
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" "$@"
}
Jika saya yakin tentang lokasi yang dapat dieksekusi, saya cukup mengetik /usr/bin/fossil. Bash mengakui itu /berarti perintah itu dapat dieksekusi, bukan fungsi. Tetapi karena saya tidak tahu lokasi persisnya, saya harus menelepon whichdan memeriksa hasilnya. Apakah ada cara yang lebih sederhana?
/berarti perintah itu dapat dieksekusi, bukan fungsi." Sebenarnya, itu tidak benar. Dalam apa yang saya yakini sebagai keputusan desain yang mengerikan (dan tidak berdokumen), bash memungkinkan nama fungsi mengandung garis miring. Garis miring hanya menyebabkan/usr/bin/fossilmenjadi berbeda tali darifossil, sehingga, ketika Anda mengatakan/usr/bin/fossil, tidak mencoba untuk menjalankanfossilfungsi.