Bagaimana cara memaksa kata Bash untuk merujuk alias, fungsi, file, dll?


13

Ketika mencoba menambahkan sedikit lebih detail ke pertanyaan terkait , saya menyadari saya tidak tahu bagaimana menentukan salah satu dari jenis kata Bash yang tersedia untuk dieksekusi. Menurut help typeada lima jenis kata:

  • alias
  • kata kunci
  • fungsi
  • builtin
  • mengajukan

Ada kemungkinan sebuah kata memiliki beberapa jenis ( truehanya sebuah contoh; kata yang lebih umum diganti cd):

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

Bagaimana Anda memaksa pelaksanaan sinonim tertentu? Sejauh ini, dalam urutan prioritas:

  • alias: Ini adalah kasus khusus karena ia lebih diutamakan dari semua sinonim lainnya. Memaksa ini hanya akan berguna ketika perintah gagal jika alias tidak didefinisikan.

    $ 
  • kata kunci:

    $ 
  • fungsi:

    $ 
  • builtin:

    $ builtin true
  • mengajukan:

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

Solusi sebagian :

  • Mengutip kata tidak termasuk alias dan kata kunci. Itu adalah,

    $ 'true'

    hanya akan menjalankan fungsi, builtin atau file.

Jawaban:


10

Apa yang Anda tanyakan sebenarnya tidak masuk akal.

kata kunci berarti kata yang merupakan bagian dari sintaksis shell. Itu dikenali melalui tokenising. Mengutipnya sudah cukup bagi shell untuk berhenti mengenali.

Dimungkinkan untuk alias kata kunci di sebagian besar shell. Jadi, alias lebih diutamakan daripada kata kunci (pada dasarnya kata tersebut diperluas lebih awal, dan ada lebih banyak tokenising setelah itu di mana Anda dapat memiliki lebih banyak alias, kata kunci) ...

alias (dengan pengecualian alias zsh yang didefinisikan dengan alias -ghanya diperluas dalam posisi perintah), jadi biasanya tidak dalam builtin the-alias.

fungsi memiliki prioritas di atas builtin, dan builtin di atas perintah eksternal (dan kemudian $PATHmemutuskan mana yang akan digunakan).

Anda dapat memaksa builtin dengan:

builtin the-cmd and its args

(meskipun harus dicatat itu bukan perintah standar).

Anda dapat menonaktifkan alias dengan mengutipnya (meskipun versi yang dikutip juga bisa dibuat dalam beberapa shell).

Jadi, misalnya (di sini sintaks zsh), di:

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

Menulis while truesebenarnya akan menghasilkan alias while true, dan tidak akan ada cara untuk menggunakan whilekata kunci karena mengutip itu akan menonaktifkan alias dan kata kunci.

Anda akan memanggil whilefungsi dengan misalnya:

'whi'le whatever

Jika ada whilebuiltin (tapi tentu saja mereka tidak akan ada di shell yang memiliki whilekata kunci), Anda akan menulisnya:

builtin while whatever

Dan untuk memanggil whileperintah, Anda akan menulis:

env while whatever

atau dalam zsh(saat tidak dalam shpersaingan):

command while whatever 

(di shell lain, commandhanya mencegah fungsi, bukan bawaan)

Atau

/full/path/to/while whatever

Tentu saja, tidak ada yang menghentikan Anda dari melakukan hal-hal yang lebih konyol seperti:

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

Yang, setidaknya dalam zsh valid (tapi bodoh).


Mengutip menekan pencarian alias, dan command menekan pencarian fungsi, tetapi tak satu pun dari ini menentukan mana dari sinonim yang tersisa akan digunakan. Saya mencari cara untuk menentukan untuk mengeksekusi hanya sinonim tertentu .
l0b0

@ l0b0 "command" menekan semua alias, kata kunci, dan builtin.
Stéphane Chazelas

Adapun masuk akal, builtindigunakan dalam RVM misalnya untuk menimpa cduntuk efek yang bagus.
l0b0

Kamu benar; dan saya baru saja memverifikasi bahwa itu juga menekan fungsi. +1.
l0b0

0

Ungkapan yang sangat berguna bagi saya adalah ini:

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
}

Sekarang jika saya menjalankan skrip dengan -D yang ditentukan, mode pengembangan diaktifkan, dan cd (atau perintah lainnya yang dibungkus) menggemakan info debug

Ini sangat berguna dengan skrip yang menjalankan ssh. Tentu saya bisa beralih -x, tetapi ini lebih bermanfaat dan mudah dibaca, bagi saya.


1
Bagaimana ini menjawab pertanyaan?
l0b0
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.