Sementara an aliasadalah salah satu cara untuk melakukannya, ini dapat dilakukan dengan evaljuga - hanya saja Anda tidak begitu ingin evaleksekusi perintah seperti yang Anda inginkan evalpada deklarasi perintah .
Saya suka aliases - saya menggunakan mereka sepanjang waktu, tapi saya suka fungsi lebih baik - terutama kemampuan mereka untuk menangani parameter dan bahwa mereka tidak perlu diperluas dalam posisi perintah seperti yang diperlukan untuk aliases.
Jadi saya pikir mungkin Anda ingin mencoba ini juga:
_time() if set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
'; then set -- "$1" "$2" "$*"; unset IFS
eval "$1 $TIME ${3#"$1"?"$2"?}"
fi
The $IFSbit terutama tentang $*. Sangat penting bahwa ( subshell bit )ini juga merupakan hasil dari ekspansi shell dan jadi untuk memperluas argumen menjadi string yang dapat diuraikan yang saya gunakan "$*" (jangan eval "$@", omong-omong, kecuali jika Anda yakin semua argumen dapat digabungkan pada spasi) . Pemisah pemisah antara args in "$*"adalah byte pertama $IFS, dan karenanya bisa berbahaya untuk melanjutkan tanpa memastikan nilainya. Jadi fungsinya menyimpan $IFS, menetapkannya ke \nbaris baru cukup lama set ... "$*"menjadi "$3", unsets itu, lalu mengatur ulang nilainya jika sebelumnya memiliki satu.
Ini sedikit demo:
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
'command -V time' \
'hash time' \
\) 'set +x'
Anda lihat saya meletakkan dua perintah di nilai $TIMEsana - nomor berapa pun baik - bahkan tidak ada - tapi pastikan itu lolos dan dikutip dengan benar - dan hal yang sama berlaku untuk argumen _time(). Mereka semua akan digabungkan menjadi string perintah tunggal ketika dieksekusi - tetapi masing-masing arg mendapatkan \newline sendiri dan sehingga mereka dapat disebarkan dengan relatif mudah. Atau Anda bisa mengelompokkannya menjadi satu, jika mau, dan memisahkannya di \newline atau semi-titik dua atau apa pun yang Anda miliki. Pastikan saja satu argumen mewakili perintah yang akan membuat Anda merasa nyaman untuk meletakkan barisnya sendiri dalam sebuah skrip ketika Anda menyebutnya. \(, misalnya baik-baik saja, asalkan pada akhirnya diikuti dengan \). Pada dasarnya hal-hal normal.
Ketika evalmendapat potongan di atas, sepertinya:
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
Dan, hasilnya terlihat seperti ...
KELUARAN
+++ echo any number of subshells
++ echo 'any number of subshells'
any number of subshells
++ command -V time
time is a shell keyword
++ hash time
bash: hash: time: not found
real 0m0.003s
user 0m0.000s
sys 0m0.000s
++ set +x
The hashkesalahan menunjukkan bahwa saya tidak memiliki /usr/bin/timediinstal (karena saya tidak) dan commandmari kita tahu mana waktu berjalan. Trailing set +xadalah perintah lain yang dieksekusi setelah time (yang mungkin) - penting untuk berhati-hati dengan perintah input saat memasukkan evalapa pun.