Переопределение встроенного «выбора» - PullRequest
0 голосов
/ 08 марта 2020

Недавно я попытался переопределить три общие команды:

  • sleep
  • wait
  • select

Первая (sleep) - это обычно внешняя корзина (/bin/sleep в моем Debian 10). Второй (wait) является встроенным (Вы можете проверить это с помощью command -v wait). Третий (select) также является встроенным.

Я напишу несколько примеров, чтобы воспроизвести, что работает, а что нет, наберитесь терпения.

Нет проблем в переопределении sleep и wait, я просто добавил где-то в своем коде следующее:

sleep() {
  echo using custom sleep
}
wait() {
  echo using custom wait
}

Вещи меняются, когда я пытаюсь переопределить select.

В частности, если я пытаюсь чтобы создать простую функцию, как описано выше, я получаю ошибки, так как парсер (?) думает, что я пытаюсь использовать команду, а не создавать новую функцию.

Вы можете воспроизвести ошибку с помощью следующего:

#!/bin/bash
select() {
  echo using custom select
}

Этого можно избежать, используя обозначение function select() {.

Если я использую интерактивную оболочку, я могу решить проблему с помощью alias ; шаги для воспроизведения:

_select() { echo using custom select;}
alias select='_select'
select

НО это решение не работает, если я использую файлы.

Давайте попробуем что-то вроде:

#!/bin/bash
# this is the actual script
. lib.sh
select

... and:

#!/bin/bash
# this is where I declare the function select
_select() {
  echo using custom select
}
alias select='_select'

Если я запускаю script, который в свою очередь вызывает lib.sh, я получаю сообщение об ошибке при попытке вызвать мой псевдоним.

Это для меня первый раз, когда псевдоним - это «второй выбор» после встроенного.

Есть ли что-то, что я делаю не так, или это действительно «ошибка»?

Очевидно, что Обходной путь - переименовать функцию во что-то еще.

1 Ответ

2 голосов
/ 08 марта 2020

Со страницы руководства bash в разделе ALIASES:

Псевдонимы не раскрываются, когда оболочка не является интерактивной, если параметр оболочки expand_aliases не установлен с помощью shopt (см. описание shopt ниже SHELL BUILTIN COMMANDS)

Либо добавьте

shopt -s expand_aliases

перед первым использованием select, либо добавьте -i к своему шебангу

#!/bin/bash -i

для интерактивной оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...