
Considere uma situação em que eu executo esses comandos em meu shell atual ou os coloco dentro .bashrc
:
alias source='echo hi'
alias .='echo hi'
alias unalias='echo hi'
Ou function source(){ echo hi; }
, etc.
No caso de comandos binários, podemos usar o caminho absoluto como: /bin/ls
, no entanto, como posso executar especificamente qualquer um desses comandos internos do shell dentro do meu shell atual?
Responder1
Bash tem o comando builtin
para isso:
builtin: builtin [shell-builtin [arg ...]]
Execute shell builtins.
Execute SHELL-BUILTIN with arguments ARGs without performing command
lookup.
Por exemplo
$ cat > hello.sh
echo hello
$ source() { echo x ; }
$ source hello.sh
x
$ builtin source hello.sh
hello
Nada impede que você substitua builtin
, no entanto.
Outra maneira de contornar aliases (mas não funções) é citar (parte da) palavra:
$ alias source="echo x"
$ source hello.sh
x hello.sh
$ \source hello.sh
hello
Responder2
Aliases sempre podem ser ignorados citando qualquer parte do nome do comando, por exemplo, \source
ou ou 'source'
ou ''source
… (a menos que você tenha definido aliases para aqueles que zsh
, mas não outros shells, permitem).
As funções podem ser ignoradas com o command
prefixo (por exemplo command source
, ) em qualquer shell POSIX. No bash ou zsh você pode usar builtin
em vez de command
forçar o uso de um builtin ( command
volta para uma PATH
pesquisa se não houver nenhum builtin com esse nome, e no zsh (exceto ao emular outros shells), command
ignora completamente os builtins). Você pode desarmar uma função com, por exemplo unset -f source
, .
Se você substituiu ou desativou todos os builtin
, command
e unset
, talvez seja necessário abandonar a ideia de restaurar essa instância do shell para um estado razoável.