
Рассмотрим ситуацию, когда я запускаю эти команды в своей текущей оболочке или помещаю их внутрь .bashrc
:
alias source='echo hi'
alias .='echo hi'
alias unalias='echo hi'
Или function source(){ echo hi; }
и т.д.
В случае бинарных команд мы можем использовать абсолютный путь, например: /bin/ls
, однако как мне конкретно запустить любую из этих встроенных команд оболочки внутри моей текущей оболочки?
решение1
В Bash для этого есть команда builtin
:
builtin: builtin [shell-builtin [arg ...]]
Execute shell builtins.
Execute SHELL-BUILTIN with arguments ARGs without performing command
lookup.
Например
$ cat > hello.sh
echo hello
$ source() { echo x ; }
$ source hello.sh
x
$ builtin source hello.sh
hello
Однако ничто не мешает вам переопределить builtin
.
Другой способ обойти псевдонимы (но не функции) — заключить слово (его часть) в кавычки:
$ alias source="echo x"
$ source hello.sh
x hello.sh
$ \source hello.sh
hello
решение2
Псевдонимы всегда можно обойти, заключив в кавычки любую часть имени команды, например, \source
или или 'source'
или ''source
… (если только вы не определили для них псевдонимы, что допускается только в оболочках zsh
, но не в других оболочках).
Функции можно обойти с помощью command
префикса (например, command source
) в любой оболочке POSIX. В bash или zsh вы можете использовать builtin
вместо , command
чтобы принудительно использовать встроенную функцию ( command
возвращается к PATH
поиску, если встроенной функции с таким именем нет, а в zsh (за исключением случаев эмуляции других оболочек) command
полностью пропускает встроенные функции). Вы можете отменить установку функции с помощью , например unset -f source
, .
Если вы переопределили или отключили все builtin
, command
и unset
, вам, возможно, придется отказаться от идеи восстановления этого экземпляра оболочки до приемлемого состояния.