Як змусити слово Bash посилатися на псевдонім, функцію, файл тощо?


13

Намагаючись додати трохи детальніше до пов'язаного питання , я зрозумів, що не знаю, як вказати, який із доступних типів слів Bash виконувати. Відповідно до help typeп'яти типів слів:

  • псевдонім
  • ключове слово
  • функція
  • вбудований
  • файл

Можливо, що слово має декілька типів ( trueце лише приклад; більш поширене слово може бути cd):

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

Як ви змушуєте виконання певного синоніма? Поки в порядку пріоритетності:

  • псевдонім: Це особливий випадок, оскільки він має перевагу над усіма іншими синонімами. Вимушування цього буде корисним лише тоді, коли команда повинна вийти з ладу, якщо псевдонім не визначений.

    $ 
  • ключове слово:

    $ 
  • функція:

    $ 
  • вбудований:

    $ builtin true
  • файл:

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

Часткові рішення :

  • Цитування слова виключає псевдоніми та ключові слова. Тобто,

    $ 'true'

    запустить лише функцію, вбудований файл або файл.

Відповіді:


10

Те, що ви запитуєте, насправді не має великого сенсу.

ключове слово означає, що це слово, яке є частиною синтаксису оболонки. Вони розпізнаються за допомогою маркірування. Цитування їх достатньо, щоб оболонка перестала розпізнавати.

Хоча ключове слово в більшості оболонок можливо. Отже, псевдоніми мають перевагу над ключовими словами (фактично вони розгортаються рано, а після цього є більше маркірування, де ви можете мати більше псевдонімів, ключових слів) ...

псевдоніми (за винятком zsh псевдонімів, визначених з alias -g, розширені лише в командному положенні), тому зазвичай не в builtin the-alias.

функції мають перевагу над вбудованими, а вбудовані над зовнішніми командами (а потім $PATHвирішують, яку використовувати).

Ви можете примусити вбудований за допомогою:

builtin the-cmd and its args

(хоча слід зазначити, що це не стандартна команда).

Ви можете вимкнути псевдоніми, цитуючи їх (хоча версія, що цитується, також може бути псевдонімом у деяких оболонках).

Так, наприклад (тут синтаксис zsh) у:

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

Написання while trueфактично виводить alias while true, і не було б можливості використовувати whileключове слово, оскільки його цитування відключить псевдонім і ключове слово.

Ви б назвали цю whileфункцію, наприклад:

'whi'le whatever

Якби був whileвбудований (але, звичайно, їх не було б у тих оболонках, які мають whileключове слово), ви напишете це:

builtin while whatever

А щоб викликати whileкоманду, ви напишете:

env while whatever

або в zsh(якщо не в shемуляції):

command while whatever 

(в інших оболонках commandлише запобігає функціям, а не вбудованим)

Або

/full/path/to/while whatever

Звичайно, ніщо не заважає тобі робити навіть дурніші речі, такі як:

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

Що, принаймні, в zsh є дійсним (але дурним).


Цитування пригнічує пошук псевдонімів і command пригнічує пошук функції, але жоден з них не вказує, який із решти синонімів буде використовуватися. Я шукаю спосіб вказати виконання лише певного синоніма.
l0b0

@ l0b0 "команда" придушує всі псевдоніми, ключові слова та вбудовані.
Стефан Шазелас

Що стосується сенсу, builtinвикористовується, наприклад, RVM, щоб переоцінити cdдля приємного ефекту.
l0b0

Ти маєш рацію; і я просто перевірив, що він також пригнічує функції. +1.
l0b0

0

Надзвичайно корисна для мене ідіома така:

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
}

Тепер, якщо я запускаю скрипт із вказаним -D, активується режим розробки, і CD (або будь-яка інша обгорнута команда) перегукується з інформацією про налагодження

Це особливо корисно для скриптів, які виконують ssh. Звичайно, я міг би переключити набір -x, але це для мене корисніше і легше для читання.


1
Як це відповідає на питання?
l0b0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.