Sementara an alias
adalah salah satu cara untuk melakukannya, ini dapat dilakukan dengan eval
juga - hanya saja Anda tidak begitu ingin eval
eksekusi perintah seperti yang Anda inginkan eval
pada deklarasi perintah .
Saya suka alias
es - 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 alias
es.
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 $IFS
bit 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 \n
baris baru cukup lama set ... "$*"
menjadi "$3"
, unset
s 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 $TIME
sana - 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 \n
ewline sendiri dan sehingga mereka dapat disebarkan dengan relatif mudah. Atau Anda bisa mengelompokkannya menjadi satu, jika mau, dan memisahkannya di \n
ewline 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 eval
mendapat 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 hash
kesalahan menunjukkan bahwa saya tidak memiliki /usr/bin/time
diinstal (karena saya tidak) dan command
mari kita tahu mana waktu berjalan. Trailing set +x
adalah perintah lain yang dieksekusi setelah time
(yang mungkin) - penting untuk berhati-hati dengan perintah input saat memasukkan eval
apa pun.