Bir iken aliasbunu yapmak için bir yoldur, bu olabilir yapılabilir evalyanı - bu kadar çok istemiyorum bu sadece var evalistediğiniz kadar komut yürütme evalkomutu beyanı .
Ben aliases gibi - Ben her zaman onları kullanmak, ama daha iyi fonksiyonları severim - özellikle parametreleri işleme yetenekleri ve aliases için gerektiği gibi komut konumunda genişletilmesi gerekmez .
Bu yüzden belki de bunu denemek isteyeceğini düşündüm:
_time() if set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
'; then set -- "$1" "$2" "$*"; unset IFS
eval "$1 $TIME ${3#"$1"?"$2"?}"
fi
$IFSBiraz esas olarak ilgili olduğu $*. O Bu çok önemli ( subshell bit )olduğunu da bir kabuk genişlemesi sonucu ve böylece bir ayrıştırılamaz dize ben kullanıma argümanları genişletmek için "$*" (yok eval "$@", bu arada, args ediyoruz belirli bütün alanlarda bağlı olarak birleştirilebilir sürece) . Arg'ler arasındaki bölünmüş sınırlayıcı "$*"ilk bayttır $IFSve bu nedenle değerini bilmeden ilerlemek tehlikeli olabilir. Fonksiyon kazandırır Yani $IFS, bir şekilde ayarlıyor \nyeterince uzun için ewline set ... "$*"içine "$3", unsetdaha önce bir tane olsaydı o zaman değerini sıfırlar böyle.
İşte küçük bir demo:
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
'command -V time' \
'hash time' \
\) 'set +x'
Gördüğünüz gibi $TIMEoraya iki komut koydum - herhangi bir sayı gayet iyi - hatta hiçbiri - ama kaçtığından ve doğru şekilde alıntılandığından emin olun - ve aynı şey argümanlar için de geçerli _time(). \nÇalıştırıldıklarında hepsi tek bir komut dizesine birleştirilecektir - ancak her arg kendi ewline'ını alır ve böylece nispeten kolayca yayılabilir. Ya da isterseniz hepsini bir araya \ntoplayabilir ve ewline veya noktalı virgül veya neye sahip olduğunuza ayırabilirsiniz. Tek bir argümanın, komut dosyası çağırdığınızda kendi satırına koymak için rahat hissettiğiniz bir komutu temsil ettiğinden emin olun. \(, örneğin, sonunda takip edildiği sürece iyidir \). Temelde normal şeyler.
Ne zaman evalyukarıdaki pasajı bunu beslenen alır gibi görünüyor:
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
Ve sonuçları ...
ÇIKTI
+++ 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
hashHata Ben yok olduğunu gösterir /usr/bin/timeyüklü (I do not çünkü) ve commandbizi çalıştığı zaman biliyorum yapalım. Sondaki sonrakiset +x bir komuttur (mümkün) - herhangi bir şey girerken giriş komutlarına dikkat etmek önemlidir . time eval