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.Jawaban:
Gunakan
command
shell builtin:sumber
\date
.Dalam skrip,
#!
baris sering digunakan/bin/env bash
untuk menjalankan perintah bash berdasarkan path. (Mungkin berbeda untuk beberapa utilitas). Ini harusnya bekerja di sini juga ...(
command
Alternatifnya juga harus bekerja, tetapi mungkin tergantung pada shell tertentu) (Ini bekerja pada Shell Bourne pada Solaris, tetapi sebenarnya berjalan/bin/command
dalam kasus itu, yang merupakan shell yang dibangun pada Bash)Keduanya
/bin/command
dan/bin/env
terdaftar dalam SUS, sehingga semua implementasi yang sesuai harus memilikinya.sumber
env
. Saya ragu jawaban mana yang harus saya terima, tetapi karena pertanyaannya adalah bash , bawaannyacommand
adalah solusi terbaik.command
dapat dieksekusi, tetapicommand
juga berfungsidash
,ksh
danzsh
. Jadi saya menganggap itu adalah shell yang tidak hanya di dalambash
. pastebin.com/fi3gyNse/bin/env
setelah hash-bang jika mereka tidak ingin kode-keras jalan shell)Jawaban Gert membuat saya sadar bahwa seseorang juga dapat menggunakannya
nice
untuk tujuan itu (saya benar-benar memilikinya di salah satu skrip saya tanpa menyadarinya):Itu kurang elegan daripada jawaban lain, tetapi dalam beberapa keadaan itu bisa menjadi pilihan yang berguna.
sumber
`which date`
.`which something`
adalah bahwa jika tidak ada yangsomething
dapat dieksekusi, hal-hal yang disayangkan dapat terjadi. Misalnya jikaecho
hilang maka`which echo` /bin/rm preciousFile
lakukan sesuatu yang sangat berbeda dari yang dimaksudkan.