Bash'yi kabuk yerleşik yerine harici `time` komutunu kullanın.


27

Bash'nin shell anahtar kelimesi yerine varsayılan olarak (/ usr / bin / time) ikili kullanımını nasıl yapabilirim?

which timedöndürür /usr/bin/time
type timedöndürür time is a shell keyword
Koşu time, açıkça shell anahtar kelimesini çalıştırıyor:

$ time

real    0m0.000s
user    0m0.000s
sys     0m0.000s
$ /usr/bin/time
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
   [--portability] [--format=format] [--output=file] [--version]
   [--quiet] [--help] command [arg...]

enable -n time döner bash: enable: time: not a shell builtin

Yanıtlar:


30

commandNormal arama işlemini atlamak için kabuğu yerleşik olarak kullanabilir ve verilen diğer komutlardan (kabuk yerleşikleri, takma adlar, vb.) Bağımsız olarak verilen komutu harici komut olarak çalıştırabilirsiniz. Bu genellikle muhtemelen daha yaygın kısaltmalar kullanarak rağmen, sistemleri arasında taşınabilir olması gerekir komut yapılır \(olduğu gibi \rmyerine command rmveya rmözellikle ikincisi şey gibi bilinmemektedir diğer adı edilebilir, rm -i).

$ time

real    0m0.000s
user    0m0.000s
sys 0m0.000s
$ command time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]
$ 

Bu, böyle bir takma adla kullanılabilir:

$ alias time='command time'
$ time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]
$ 

Bunun avantajı, örneğin alias time=/usr/bin/time, timeikili dosyaya giden tam yolu belirtmemeniz, bunun yerine normal yol arama mekanizmasına geri dönmenizdir.

aliasKendisi ~ / .bashrc veya /etc/bash.bashrc ör geçebiliriz komutu (ikincisi sistem üzerindeki tüm kullanıcılar için geneldir).

Tersi durumda (tanımlanmış bir takma ad olması durumunda kabuğun yerleşik kullanımını zorlamak için), builtin timeyine normal arama işlemini geçersiz kılan ve adlandırılmış kabuğu yerleşik olarak çalışan bir şey kullanırsınız . Bash man sayfası, bunun yerine gerçek olanı yapmak için yerleşimi kullanan cdadlı bir işlevle özel işlevsellik sağlamak için sık sık kullanıldığını cdbelirtir cd.


Ayrıca, komutu kullanarak belirli bir komutun nereden geldiğini de sorgulayabilirsiniz type -a <cmd>.
slm

12
commandyerleşikleri atlamaz ( zshdiğer kabuklara öykünmediği durumlar hariç ). İşlevleri atlar ve varlığının temel nedeni budur. Onun ikinci rolü kaldırmaktır special içinde özel yerleşikleri . Yalnızca takma adları ve anahtar kelimeleri atlar, çünkü bunlar yalnızca ilk konumda genişletilirler ( zshörneğin, genel takma adları atlamaz). Hiçbir yoktur timebash yerleşik. timeörneğin bir anahtar kelimedir time { foo; bar; }.
Stéphane Chazelas

1
@StephaneChazelas Elbette, daha doğru bir açıklama sağlamak için bunu cevabı düzenlemek için çekinmeyin. commandBu özel durumda, örneklendiği gibi çalışır, ancak açık bir şekilde doğru cevap yarı-sağdan daha iyidir.
44'te bir CVn

1
Cevabınızın son kısmı yanlış. Zaman bir kabuk yerleşik değil, bir kabuk anahtar sözcüğüdür. builtin timeçalışmıyor
Teresa e Junior

komuta benzer sadece alıntı yapmak olurdu:'time' echo test
mxmlnkn

9

Bir yol belirtmeden veya başka bir yerleşik gibi kullanmak zorunda kalmadan, bash'te anahtar sözcükleri kısaltmak için bir kısayol vardır command: Ters eğik çizgiyle çıkın.

=^_^= izkata@Izein:~$ time

real    0m0.000s
user    0m0.000s
sys     0m0.000s
=^_^= izkata@Izein:~$ \time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]

Şahsen, mümkün olduğu kadar bunu daha okunaklı ve güvenli buluyorum:

=^_^= izkata@Izein:~$ alias command=echo
=^_^= izkata@Izein:~$ command time
time

8
Not yapar alıntı ya da bir şey herhangi bir biçimde bu değil belirteç timeyapacak: ti\me, 'time', ti""me, ti${-##*}me, ${-+time}... Bu herhangi bir kabuk anahtar kelime için de geçerlidir.
Stéphane Chazelas

En iyi PS1 henüz gördüm.
maxywb

1
@ maxywb Ayrıca, sadece dekoratif değil - son komut başarısız olursa, mutlu yüz kırmızıya dönüşür(x_x)
Izkata

4

Yapılar için genel çözümler (örneğin test) [1] :

  • kullanın env(tüm kabukları)

    $ env test
    external test
  • yerleşimi devre dışı bırak (yalnızca bash ve zsh):

    $ test 1 = 1 && echo "yes"
    yes
    $ enable -n test        ### for bash. Re-enable with "enable test".
    $ disable test          ### for zsh. Re-enable with "enable test".
    $ test
    external test
  • /Komutu çağırmak için herhangi bir eğik çizgi kullanın (tüm kabukları):

    $ test 1 = 1 && echo "yes"
    yes 
    $ ~/bin/test
    external test
  • bir takma ad oluşturun (kullanmanız dışında bash betiğinin içinde başarısız olur shopt -s expand_aliases):

    $ alias test='~/bin/test'             ### remove with 'unalias test'.
    $ test
    external test

Fakat zaman bir yerleşik değil.

Kelime timebir "Ayrılmış kelime" dir, bir komut değil, ne de yerleşiktir. Bu, bu çözümleri mümkün kılar:

  • Sözünü alıntı. Bu yerleşiklerle çalışmaz.
    Birçok alıntı yapma şekli: \time "time" 'time' ti\me ti"me"vb.

    $  time
    
    real    0m0.000s
    user    0m0.000s
    sys     0m0.000s
    
    $ \time
    Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
           [--portability] [--format=format] [--output=file] [--version]
           [--quiet] [--help] command [arg...]

    Bu bir takma adı atlamak için kullanışlıdır. Diğer testadı \testtakılı olsa bile , PATHed komutunu (ya da devre dışı bırakılmamışsa yerleşik) uygular.

  • Yerleşikini kullanın command(bu yerleşiklerle çalışmaz):

    $ command time
  • Ankastre için yukarıdaki gibi, herhangi bir eğik çizgi /çalışması kullanarak :

    $ /usr/bin/time
  • Yerleşikler için yukarıdaki gibi, bir takma ad da burada çalışır:

    $ alias time='command time'
    $ alias time='/usr/bin/time'

[1] ~/bin/test"harici test" yazdıran harici bir çalıştırılabilir olduğunu varsayalım . Ve ayrıca: ettiğini varsayalım ~/binilerisinde olan /binaktif PATH içinde.



2

enableBazı yerleşikleri devre dışı bırakmak için komutu kullanabilirsiniz .

$ enable -n kill

Ancak timebir anahtar kelime yani bu işe yaramaz.

$ builtin time
bash: builtin: time: not a shell builtin

Yani geçersiz kılmak için bir takma ad oluşturmaya başladınız:

$ alias time=/usr/bin/time

Hayır. zaman bir kabuk anahtar sözcüğüdür, bir kabuk yerleşik değil. Neredeyse cevabımı -n'nin cevap verdiğini gördüğümde işe yaramadığını söylemek için soruyu düzenlemek üzereydim.
David Holdeman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.