Como desmarcar ou me livrar de uma função bash?

33

Se você definir ou exportar uma variável de ambiente no bash, poderá desmarcá- la. Se você definir um alias no bash, poderá desmarcá- lo. Mas não parece haver uma falta de funcionalidade .

Considere esta função bash (trivial), por exemplo, configurada em um arquivo .bash_aliases e leia na inicialização do shell.

function foo () { echo "bar" ; }

Como posso limpar essa definição de função do meu shell atual?
(Alterar os arquivos de inicialização ou reiniciar o shell não conta.)

charlatão quixote
fonte
Tudo o que foi dito, unfunctionseria um bom nome para um comando :-)
Joey
@Johannes Rössel: zsh tem.
precisa
Hum, de fato. Ainda assim, acho o caminho de PowerShell de lidar com tudo isso um pouco mais intuitiva e consistente :-)
Joey

Respostas:

50

O comando interno não definido aceita uma opção -f,, para excluir funções:

unset -f foo

Forme a entrada não configurada na página de manual do bash :

Se -f for especificado, cada nome se refere a uma função shell e a definição da função é removida.

Nota: -fsó é realmente necessário se existir uma variável com o mesmo nome. Se você também não tiver uma variável nomeada foo, unset fooa função será excluída.

Chris Johnsen
fonte
era isso que eu estava perdendo. Eu encontrei o -fparâmetro na exportação, mas não o encontrei na configuração . obrigado.
quack quixote
2
@ XavierStuvw: unsetnão é um comando externo, faz parte do shell ( neste caso, bash ); tente man bashencontrar a entrada para unset(o gerenciamento é bastante grande, unsetestá na Shell Builtin Commandsseção).
Chris Johnsen
4

Veja help unset:

unset: unset [-f] [-v] [-n] [name ...]

Unset values and attributes of shell variables and functions.

For each NAME, remove the corresponding variable or function.

Options:
  -f    treat each NAME as a shell function
  -v    treat each NAME as a shell variable
  -n    treat each NAME as a name reference and unset the variable itself
    rather than the variable it references

Without options, unset first tries to unset a variable, and if that fails,
tries to unset a function.

Some variables cannot be unset; also see `readonly'.

Exit Status:
Returns success unless an invalid option is given or a NAME is read-only.

Não há unset --help nem man unsetinfelizmente.

XavierStuvw
fonte
4
Não é man unsetporque é um built-in de comando e para o built-in comandos existe vez help. Para alguns built-in comando existe um executável externo também. Em caso de dúvida tente por exemplo type mycommnad. Por exemplo, type unsete ele responderá unset is a shell builtin. Se você quiser saber se ele existe, o executável também tenta which echo(outro buikt-in) e ele diz onde está. O --option_longé típico do comando executável. Tente echo --helpe /bin/echo --help. :-).
Hastur
@Hastur Sinta-se à vontade para adicionar seu comentário à resposta editando o final. Se os revisores aprovarem, você receberá 2 pontos.
XavierStuvw
11
... obrigado pelo pensamento Xavier: foi mais para você do que completar a resposta; Eu acho que você perdeu o que era um built-in comando e para eles que você tem que usar helpem vez de man. (Não é verdade, porque você os encontra man bashno capítulo SHELL BUILTIN COMMANDS ou diretamente com man BASH-BUILTINS...). É acolhedor que, sob um shell bash, você pode simplesmente pedir helpe receberá a lista de built-in comando :-). (Tente help helpe man mantambém).
Hastur
11
@ Hastur Você pode completar a resposta para o benefício de todos os leitores. Em seguida, podemos excluir os comentários para facilitar a desorganização das letras pequenas.
XavierStuvw