Как заставить слово 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'

    будет запускаться только функция, встроенный или файл.

l0b0
источник

Ответы:

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 подавляет поиск функций, но ни один из них не определяет, какой из оставшихся синонимов будет использоваться. Я ищу способ указать, чтобы выполнить только определенный синоним.
10
@ l0b0 «команда» подавляет все псевдонимы, ключевые слова и встроенные функции.
Стефан Шазелас
Что касается смысла, builtinиспользуется, например, в RVM, чтобы переопределить cdдля хорошего эффекта.
10
Ты прав; и я только что проверил, что он также подавляет функции. +1.
10
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. Конечно, я могу переключать set -x, но для меня это более полезно и читаемо.

Грэм Николлс
источник
1
Как это отвечает на вопрос?
10