Недавно я попытался переопределить три общие команды:
Первая (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
, я получаю сообщение об ошибке при попытке вызвать мой псевдоним.
Это для меня первый раз, когда псевдоним - это «второй выбор» после встроенного.
Есть ли что-то, что я делаю не так, или это действительно «ошибка»?
Очевидно, что Обходной путь - переименовать функцию во что-то еще.