Bash kelimesini bir takma adı, işlevi, dosyayı vb. Referans göstermeye zorlama


13

İlgili bir soruya biraz daha detay eklemeye çalışırken , mevcut Bash kelime türlerinden hangisinin yürütüleceğini nasıl belirleyeceğimi bilmediğimi fark ettim. Buna göre help typebeş kelime türü vardır:

  • takma ad
  • anahtar kelime
  • fonksiyon
  • builtin
  • dosya

Bir kelimenin çeşitli türlere sahip olması mümkündür ( truesadece bir örnektir; daha yaygın olarak geçersiz kılınan bir kelime olurdu cd):

$ type -a true
true is a shell builtin
true is /bin/true

Belirli bir eşanlamın yürütülmesini nasıl zorlarsınız? Şimdiye kadar, öncelik sırasına göre:

  • takma ad: Diğer tüm eşanlamlılardan daha öncelikli olduğu için bu özel bir durumdur. Bunu zorlamak, ancak diğer ad tanımlanmadıysa komutun başarısız olması durumunda yararlı olacaktır.

    $ 
  • anahtar kelime:

    $ 
  • fonksiyon:

    $ 
  • builtin:

    $ builtin true
  • dosya:

    $ command true
    $ $(which true)
    $ /bin/true

Kısmi çözümler :

  • Bir kelimeye alıntı yapmak takma adları ve anahtar kelimeleri hariç tutar. Yani,

    $ 'true'

    yalnızca işlevi, yerleşik veya dosyayı çalıştıracaktır.

Yanıtlar:


10

Sorduğunuz şey gerçekten bir şey ifade etmiyor.

anahtar kelime , kabuğun sözdiziminin bir parçası olan bir kelime anlamına gelir. Bunlar tokenleme ile tanınır. Onları alıntılamak kabuğun tanımayı bırakması için yeterlidir.

Yine de çoğu kabukta bir anahtar kelime takma adı mümkündür. Yani, takma adlar anahtar kelimelere göre önceliğe sahiptir (aslında erken genişletilirler ve bundan sonra daha fazla takma ad, anahtar kelimeye sahip olabileceğiniz daha fazla belirteç vardır) ...

takma adlar (ile tanımlanan zsh takma adları hariç olmak alias -güzere yalnızca komut konumunda genişletilir), bu nedenle genellikle değil builtin the-alias.

fonksiyonlar yerleşik komutlara göre yerleşiktir ve harici komutlara göre yerleşiktir (ve sonra $PATHhangisinin kullanılacağına karar verir).

Yerleşikleri aşağıdakilerle zorlayabilirsiniz:

builtin the-cmd and its args

(not edilmelidir, ancak standart bir komut değildir).

Takma adları tırnaklarla devre dışı bırakabilirsiniz (alıntılanan sürüm bazı kabuklarda da takma adlara sahip olabilir).

Yani, örneğin (burada zsh sözdizimi),

'while'() echo function while
alias 'while=echo alias while'

Yazma while truegerçekten çıktı alias while trueve whileanahtar kelimeyi kullanmanın hiçbir yolu olmaz, çünkü alıntı yapıldığında hem takma ad hem de anahtar kelime devre dışı bırakılır .

whileİşlevi örneğin ile çağırırsınız :

'whi'le whatever

Bir whileyerleşik varsa (ama elbette whileanahtar kelimeli kabuklarda olmazlarsa) yazardınız :

builtin while whatever

Ve whilekomutu çağırmak için şunu yazacaksınız:

env while whatever

veya içinde zsh(öykünmede değilken sh):

command while whatever 

(diğer kabuklarda, commandyalnızca yerleşik işlevleri değil işlevleri önler)

Veya

/full/path/to/while whatever

Tabii ki, hiçbir şey sizi daha da aptalca şeyler yapmaktan alıkoymaz:

alias 'while=while "w"hile; do'
"while"() { while "whi"le; done; }

Hangi, en azından zsh için geçerlidir (ama aptal).


Alıntı yapmak takma ad aramasını command bastırır ve işlev aramasını bastırır, ancak bunların hiçbiri kalan eşanlamlılardan hangisinin kullanılacağını belirtmez. Sadece belirli bir eşanlamlı yürütmek için belirtmek için bir yol arıyorum .
l0b0

@ l0b0 "komut" tüm takma adı, anahtar kelimeyi ve yerleşimi bastırır
Stéphane Chazelas

Mantıklı gelince, güzel bir etki için geçersiz kılmak için builtinörneğin RVM'de kullanılır cd.
l0b0

Haklısın; ve sadece fonksiyonları da bastırdığını doğruladım. +1.
l0b0

0

Benim için son derece yararlı bir deyim şudur:

FALSE=1; TRUE=0
DEVEL_FLAG=$FALSE
...
in_development() { return $DEVEL_FLAG ; }
cd()
{
 if in_development ; then # -D argument to script toggles development flag
   echo "Would run cd $*"
  else
   builtin cd "$@"
 fi
}

Komut dosyasını -D belirtilmiş olarak çalıştırırsam, geliştirme modu etkinleştirilir ve cd (veya başka bir sarılmış komut) hata ayıklama bilgilerini yankılar

Bu özellikle ssh çalıştıran komut dosyalarında kullanışlıdır. Elbette set -x'i değiştirebilirim, ama bu benim için daha kullanışlı ve okunabilir.


1
Bu soruya nasıl cevap veriyor?
l0b0
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.