Há uma pergunta semelhante que lida com o cenário de 'quebra automática', em que você deseja substituir, por exemplo, cd
um comando que chama o builtin cd
.
No entanto, à luz do shellshock et al e sabendo que o bash importa funções do ambiente, eu fiz alguns testes e não consigo encontrar uma maneira de chamar com segurança o builtin cd
do meu script.
Considere isto
cd() { echo "muahaha"; }
export -f cd
Quaisquer scripts chamados neste ambiente usando cd
serão interrompidos (considere os efeitos de algo como cd dir && rm -rf .
).
Existem comandos para verificar o tipo de um comando (convenientemente chamado type
) e comandos para executar a versão interna em vez de uma função ( builtin
e command
). Mas eis que eles também podem ser substituídos usando funções
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Produzirá o seguinte:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Existe alguma maneira de forçar com segurança o bash a usar o comando embutido, ou pelo menos detectar que um comando não é um embutido, sem limpar o ambiente inteiro?
Sei que, se alguém controla seu ambiente, você provavelmente está ferrado de qualquer maneira, mas pelo menos para aliases, você tem a opção de não chamar o alias, inserindo um \
antes dele.
env
não for redefinido como uma função também. Isso é aterrorizante. Primeiro pensei que caracteres especiais ajudariam - chamando com o caminho completo que inclui /
, usar .
a fonte e assim por diante. Mas esses também podem ser usados para nomes de funções! Você pode redefinir qualquer função que desejar, mas é difícil voltar a chamar o comando original.
#/bin/sh
se este não for o shell interativo padrão.
env
comando anterior, desta forma:env -i <SCRIPT.sh>