¿Cómo desarmo o elimino una función bash?

33

Si configura o exporta una variable de entorno en bash, puede desactivarla . Si establece un alias en bash, puede desanudarlo . Pero no parece haber una falla .

Considere esta función bash (trivial), por ejemplo, establecida en un archivo .bash_aliases y leída en la inicialización del shell.

function foo () { echo "bar" ; }

¿Cómo puedo borrar esta definición de función de mi shell actual?
(Cambiar los archivos de inicialización o reiniciar el shell no cuenta).

quijote curandero
fuente
Dicho todo esto, unfunctionsería un buen nombre para un comando :-)
Joey
@Johannes Rössel: zsh lo tiene.
Chris Johnsen
Hm, de hecho. Aún así, la forma en que PowerShell trata con todo esto es un poco más intuitiva y consistente :-)
Joey

Respuestas:

50

El comando incorporado no configurado toma una opción -f, para eliminar funciones:

unset -f foo

Formar el desarmado entrada en la fiesta de página de manual:

Si se especifica -f, cada nombre se refiere a una función de shell y la definición de la función se elimina.

Nota: -fsolo es realmente necesario si existe una variable con el mismo nombre. Si no tiene una variable denominada foo, unset fooeliminará la función.

Chris Johnsen
fuente
Eso es lo que me faltaba. Encontré el -fparámetro en la exportación pero no lo encontré sin configurar . Gracias.
quack quijote
2
@XavierStuvw: unsetno es un comando externo, es parte del shell ( bash en este caso); intente man bashy encuentre la entrada para unset(la gestión es bastante grande, unsetestá debajo de la Shell Builtin Commandssección).
Chris Johnsen
4

Ver 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.

No hay unset --helpni man unsetdesafortunadamente.

XavierStuvw
fuente
44
No es man unsetporque es un built-in de comandos y para el incorporado en los comandos que hay lugar help. Para algunos comandos integrados también existe un ejecutable externo. En caso de duda intente, por ejemplo type mycommnad. Por ejemplo type unsety te responderá unset is a shell builtin. Si desea saber si existe el ejecutable, intente which echo(otro buikt-in) y le dirá dónde está. El --option_longes típico del comando ejecutable. Pruebe echo --helpy /bin/echo --help. :-).
Hastur
@Hastur Siéntase libre de agregar su comentario a la respuesta editando su cola. Si los revisores lo aprueban, se le otorgarán 2 puntos.
XavierStuvw
1
... gracias por el pensamiento Xavier: fue más para ti que completar la respuesta; Supongo que te perdiste que era un comando incorporado y para ellos debes usarlo en helplugar de man. (No es realmente cierto porque los encuentra man bashen el capítulo SHELL BUILTIN COMMANDS o directamente con man BASH-BUILTINS...). Es acogedor que bajo un shell bash simplemente puede pedir helpy recibirá la lista de comandos incorporados:-) . (Prueba help helpy man mantambién).
Hastur
1
@Hastur Puede completar la respuesta en beneficio de todos los lectores. Luego podemos eliminar los comentarios para evitar el desorden de letras pequeñas.
XavierStuvw
0

Hace poco quería desinstalarlo nvmy reinstalarlo por completo , y deshacerme de cualquiera de sus entornos. Resulta que deshacerse de él no parece ser porque gran nvmparte se implementa en parte como una gran cantidad de funciones de shell que se obtienen en su shell a través de .bash_profileo .bashrc, o donde haya agregado los comandos de abastecimiento que le indicó cuando lo instaló por primera vez.

Desconcertado al principio al which nvmno devolver nada pero claramente el nvmcomando y otros aún se encontraban, finalmente descubrí a través de declare -Fque se trata de un montón de funciones de shell. No quería simplemente matar el shell e iniciar uno nuevo (por razones no relevantes aquí), así que borré las nvmfunciones de ese shell con esto:

for F in `declare -F | grep -e nvm | cut -f 3 -d\ `; do unset -f $F; done

Algunas variaciones al respecto pueden ser útiles para alguien que, por cualquier razón, quiere hacer algo similar y no puede reiniciar un nuevo shell o no quiere hacerlo.

slowkoni
fuente