Bir iken alias
bunu yapmak için bir yoldur, bu olabilir yapılabilir eval
yanı - bu kadar çok istemiyorum bu sadece var eval
istediğiniz kadar komut yürütme eval
komutu beyanı .
Ben alias
es gibi - Ben her zaman onları kullanmak, ama daha iyi fonksiyonları severim - özellikle parametreleri işleme yetenekleri ve alias
es 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
$IFS
Biraz 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 $IFS
ve bu nedenle değerini bilmeden ilerlemek tehlikeli olabilir. Fonksiyon kazandırır Yani $IFS
, bir şekilde ayarlıyor \n
yeterince uzun için ewline set ... "$*"
içine "$3"
, unset
daha ö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 $TIME
oraya 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 \n
toplayabilir 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 eval
yukarı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
hash
Hata Ben yok olduğunu gösterir /usr/bin/time
yüklü (I do not çünkü) ve command
bizi ç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