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 diff
melalui colordiff
dan less -R
saya 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 which
dan 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/fossil
menjadi berbeda tali darifossil
, sehingga, ketika Anda mengatakan/usr/bin/fossil
, tidak mencoba untuk menjalankanfossil
fungsi.