Come posso disinserire o eliminare una funzione bash?


33

Se imposti o esporti una variabile d'ambiente in bash, puoi annullarla . Se si imposta un alias in bash, è possibile unaliarlo . Ma non sembra esserci una mancanza .

Considera questa (banale) funzione bash, ad esempio, impostata in un file .bash_aliases e letta all'inizializzazione della shell.

function foo () { echo "bar" ; }

Come posso cancellare questa definizione di funzione dalla mia shell corrente?
(La modifica dei file di inizializzazione o il riavvio della shell non conta.)


Detto questo, unfunctionsarebbe un bel nome per un comando :-)
Joey,

@Johannes Rössel: ce l' ha zsh .
Chris Johnsen,

Hm, davvero. Tuttavia, trovo il modo di PowerShell di gestire tutto questo in modo leggermente più intuitivo e coerente :-)
Joey,

Risposte:


50

Il comando integrato non impostato richiede un'opzione -fper eliminare le funzioni:

unset -f foo

Formare la voce non impostata nella manpage di bash :

Se viene specificato -f, ogni nome si riferisce a una funzione shell e la definizione della funzione viene rimossa.

Nota: -fè davvero necessario solo se esiste una variabile con lo stesso nome. Se non si dispone anche di una variabile denominata foo, unset foola funzione verrà eliminata.


questo è quello che mi mancava. avevo trovato il -fparametro in export ma non l'avevo trovato in unset . Grazie.
Quack Quixote,

2
@XavierStuvw: unsetnon è un comando esterno, fa parte della shell ( bash in questo caso); prova a man bashtrovare la voce per unset(la gestione è abbastanza grande, unsetè nella Shell Builtin Commandssezione).
Chris Johnsen,

4

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

Non c'è né unset --helpman unsetsfortunatamente.


4
Non c'è man unsetperché è un built-in di comando e per il built-in comandi v'è, invece help. Per alcuni comandi integrati esiste anche un eseguibile esterno. In caso di dubbi provare ad es type mycommnad. Ad esempio type unsete ti risponderà unset is a shell builtin. Se vuoi sapere se esiste anche l'eseguibile, prova which echo(un altro buikt-in) e dirà dove si trova. Il --option_longè tipico del comando eseguibile. Prova echo --helpe /bin/echo --help. :-).
Hastur,

@Hastur Sentiti libero di aggiungere il tuo commento alla risposta modificandone la coda. Se i revisori lo approvano, riceverai 2 punti.
XavierStuvw,

1
... grazie per il pensiero Xavier: è stato più per te che completare la risposta; Immagino ti sia perso che era un comando incorporato e per loro devi usare helpinvece di man. (Non è proprio vero perché li trovi man bashnel capitolo COMANDI INCORPORATI SHELL o direttamente con man BASH-BUILTINS...). È comodo che sotto una shell bash puoi semplicemente chiedere helpe riceverai l'elenco dei comandi integrati:-) . (Provaci help helpe man mananche).
Hastur,

1
@Hastur Puoi completare la risposta a beneficio di tutti i lettori. Quindi possiamo eliminare i commenti per liberare il disordine di caratteri piccoli.
XavierStuvw

0

Di recente ho voluto disinstallarlo completamente nvme reinstallarlo e liberarmi di qualsiasi suo ambiente. Si scopre che sbarazzarsene non sembra perché gran parte nvmè in parte implementata come un carico di funzioni della shell che vengono acquistate nella shell tramite .bash_profileo .bashrc, o ovunque tu abbia aggiunto quei comandi di sourcing che ti hanno detto quando l'hai installata la prima volta.

Sconcertato all'inizio which nvmnon restituendo nulla ancora chiaramente il nvmcomando e altri ancora venivano trovati, alla fine ho scoperto declare -Fche sono un sacco di funzioni di shell. Non volevo semplicemente uccidere la shell e avviarne una nuova (per motivi non rilevanti qui), quindi ho cancellato le nvmfunzioni da quella shell con questo:

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

Alcune variazioni su ciò potrebbero essere utili a qualcuno là fuori che per qualsiasi motivo vuole fare qualcosa di simile e non può riavviare una nuova shell o non vuole.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.