web-dev-qa-db-ja.com

bash関数を設定解除または削除するにはどうすればよいですか?

Bashで環境変数を設定またはエクスポートする場合、nsetを使用できます。 bashでエイリアスを設定する場合、naliasを使用できます。しかしnfunctionはないようです。

たとえば、(簡単な)bash関数を考えてみましょう。 .bash_aliases ファイルを作成し、シェルの初期化時に読み取ります。

function foo () { echo "bar" ; }

現在のシェルからこの関数定義をクリアするにはどうすればよいですか?
(初期化ファイルの変更またはシェルの再起動はカウントされません。)

37
quack quixote

nset組み込みコマンドはオプション-fを取り、関数を削除します。

unset -f foo

bashマンページにnsetエントリを作成します。

-fが指定されている場合、各名前はシェル関数を参照し、関数定義は削除されます。

注:-fは、同じ名前の変数が存在する場合にのみ必要です。 fooという名前の変数もない場合、unset fooは関数を削除します。

58
Chris Johnsen

見る 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.

どちらもありませんunset --helpまたはman unset残念ながら。

4
XavierStuvw

私は最近、nvmを完全にアンインストールして再インストールし、その環境をすべて削除したいと考えていました。 nvmの大部分は.bash_profileまたは.bashrcを介してシェルに供給されるシェル関数のボートロードとして部分的に実装されているため、それを取り除くことはできないようですどこにソースコマンドを追加したかにかかわらず、最初にインストールしたときに表示されます。

最初はwhich nvmが何も返さずに明らかに困惑しましたが、nvmコマンドやその他のコマンドはまだ見つかっていましたが、declare -Fを介して、シェル関数の集まりであることがわかりました。シェルを終了して新しいシェルを開始したくなかったので(ここでは関係ない理由で)、次のようにして、シェルからnvm関数をクリアしました。

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

そのいくつかのバリエーションは、何らかの理由で同じようなことをしたい、新しいシェルを再起動できない、またはしたくないという人にとって役立つかもしれません。

0
slowkoni