Olivier D está quase correto, mas você deve definir POSIXLY_CORRECT=1
antes de executar unset
. POSIX tem uma noção de Especial Built-ins e bash suporta isso . unset
é um desses recursos internos. Pesquise SPECIAL_BUILTIN
em builtins/*.c
na fonte bash de uma lista, ele inclui set
, unset
, export
, eval
e source
.
$ unset() { echo muahaha-unset; }
$ unset unset
muahaha-unset
$ POSIXLY_CORRECT=1
$ unset unset
O rogue unset
foi agora removido do ambiente, se você não selecionar command
, type
, builtin
, então poderá continuar, mas unset POSIXLY_CORRECT
se estiver contando com não-POSIX comportamento ou recursos avançados do bash.
Este não endereça aliases, então você deve usar \unset
para ter certeza de que funciona no shell interativo (ou sempre, no caso de expand_aliases
estar em vigor).
Para o paranoico, isso deve corrigir tudo, eu acho:
POSIXLY_CORRECT=1
\unset -f help read unset
\unset POSIXLY_CORRECT
re='^([a-z:.\[]+):' # =~ is troublesome to escape
while \read cmd; do
[[ "$cmd" =~ $re ]] && \unset -f ${BASH_REMATCH[1]};
done < <( \help -s "*" )
( while
, do
, done
e [[
são palavras reservadas e não precisam de precauções.)
Note que estamos usando unset -f
para ter certeza de descomprimir funções, embora variáveis e funções compartilhem o mesmo espaço de nomes, é possível que ambas existam simultaneamente (graças a Etan Reisner). Nesse caso, descomplicar duas vezes também funcionaria. Você pode marcar uma função readonly, bash não impede que você desabilite uma função readonly até e incluindo o bash-4.2, o bash-4.3 impede você, mas ainda honra os comandos especiais quando POSIXLY_CORRECT
está definido .
Um readonly POSIXLY_CORRECT
não é um problema real, isto não é um booleano ou sinaliza sua presença ativa o modo POSIX, então se ele existir como um readonly você pode confiar nos recursos POSIX, mesmo se o valor está vazio ou 0. Você simplesmente precisará desfazer funções problemáticas de uma maneira diferente da acima, talvez com alguns recortes e colagens:
\help -s "*" | while IFS=": " read cmd junk; do echo \unset -f $cmd; done
(e ignore os erros) ou participe de outros scriptsobáticos .
Outras notas:
-
function
é uma palavra reservada, pode ser aliada, mas não substituída por uma função. (Aliasingfunction
é levemente problemático porque\function
não é aceitável como uma maneira de contornar isso) -
[[
,]]
são palavras reservadas, elas podem ter um alias (que serão ignoradas), mas não substituídas por uma função (embora as funções possam ser assim nomeadas) -
((
não é um nome válido para uma função, nem um alias