Как стать автором
Обновить
0
0
vorakl @vorakl

Пользователь

Отправить сообщение
По крайней мере, именно эту проблему, --posix параметр решает, не беря во внимание особенностей работы bash в этом режиме

$ cat a.sh
#!/bin/bash --posix

function builtin() { echo new_builtin; }
function command() { echo new_command; }
function echo() { :; }

unset -f builtin
builtin command echo Hello World

$ ./a.sh
Hello World
Да, с alias в скриптах, справедливо ;)

А на счёт unset как новая функция, есть ещё параметр --posix и он то не даст переопределить unset, а значит и 'unset -f builtin' в начале скрипта должен сработать.

$ bash --posix -c 'function unset() { echo new-unset; }'
bash: `unset': is a special builtin
Не всё так страшно на самом деле. Если хочется быть уверенным в комманде, которую запускаешь или цель написать скрипт, устойчивый к подобного рода ситуациям, то в BASH есть built-in комманда command:

command [-pVv] command [arg ...]
Run command with args suppressing the normal shell function lookup. Only builtin commands or commands found in the PATH are executed. If the -p option is given, the search for command is performed using a default value for PATH that is guaranteed to find all of the standard utilities.

и в добавок builtin, для запуска только таковых комманд

builtin shell-builtin [arguments]
Execute the specified shell builtin, passing it arguments, and return its exit status. This is useful when defining a function whose name is the same as a shell builtin, retaining the functionality of the builtin within the function.

И вот как это работает для приведённого выше примера.
Можно игнорировать одноимённые функции при помощи 'command sudo' или даже 'command -p sudo'.
Если же кто-то попытается установить alias для command, тогда можно усилить решение через 'builtin command -p sudo'. Но если кто-то пойдёт ещё дальше, и установит alias для builtin, то можно в начале скрипта запустить команду 'unalias builtin' и потом все критичеки важные комманды запускать при помощи последнего варианта. А чтобы не делать это решение сильно усложнённым, можно начинать скрипт как

#!/bin/bash
unalias builtin
function run() { builtin command -p "$@"; }
run sudo

Ещё не плохо было бы переопределять всегда PATH в начале скрипта на что-то, что вы ожидаете там увидеть.

Итого:

$ /usr/bin/sudo -V
Sudo version 1.8.18p1
Sudoers policy plugin version 1.8.18p1
Sudoers file grammar version 45
Sudoers I/O plugin version 1.8.18p1

$ alias sudo=«echo SuD0»
$ function /usr/bin/sudo() { echo 'Truly '; }
$ alias command=«echo 'Really '»
$ alias builtin=«echo 'Eventually '»

$ /usr/bin/sudo -V
Truly

$ sudo -V
SuD0 -V

$ command sudo -V
Really sudo -V

$ command /usr/bin/sudo -V
Really /usr/bin/sudo -V

$ builtin command sudo -V
Eventually command sudo -V

$ unalias builtin
$ builtin command sudo -V
Sudo version 1.8.18p1
Sudoers policy plugin version 1.8.18p1
Sudoers file grammar version 45
Sudoers I/O plugin version 1.8.18p1

$ function run() { builtin command -p "$@"; }
$ run sudo -V
Sudo version 1.8.18p1
Sudoers policy plugin version 1.8.18p1
Sudoers file grammar version 45
Sudoers I/O plugin version 1.8.18p1

Информация

В рейтинге
Не участвует
Откуда
München, Bayern, Германия
Зарегистрирован
Активность