Как конкретно запустить встроенную команду оболочки

Как конкретно запустить встроенную команду оболочки

Рассмотрим ситуацию, когда я запускаю эти команды в своей текущей оболочке или помещаю их внутрь .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, вам, возможно, придется отказаться от идеи восстановления этого экземпляра оболочки до приемлемого состояния.

Связанный контент