Bagaimana cara menghapus atau menyingkirkan fungsi bash?

33

Jika Anda mengatur atau mengekspor variabel lingkungan di bash, Anda dapat menghapusnya . Jika Anda menetapkan alias di bash, Anda dapat membatalkannya . Tapi sepertinya tidak ada yang tidak berfungsi .

Pertimbangkan fungsi bash (sepele) ini, misalnya, diatur dalam file .bash_aliases dan dibaca pada inisialisasi shell.

function foo () { echo "bar" ; }

Bagaimana saya bisa menghapus definisi fungsi ini dari shell saya saat ini?
(Mengubah file inisialisasi atau memulai ulang shell tidak masuk hitungan.)

quack quixote
sumber
Semua yang dikatakan, unfunctionakan menjadi nama yang bagus untuk sebuah perintah :-)
Joey
@Johannes Rössel: zsh memilikinya.
Chris Johnsen
Hm, memang. Namun, saya menemukan cara PowerShell untuk berurusan dengan semua ini sedikit lebih intuitif dan konsisten :-)
Joey

Jawaban:

50

Perintah bawaan yang tidak disetel mengambil opsi -f,, untuk menghapus fungsi:

unset -f foo

Bentuk entri yang tidak disetel di halaman bash :

Jika -f ditentukan, setiap nama merujuk ke fungsi shell, dan definisi fungsi dihapus.

Catatan: -fhanya benar-benar diperlukan jika ada variabel dengan nama yang sama. Jika Anda tidak memiliki variabel bernama foo, maka unset fooakan menghapus fungsi.

Chris Johnsen
sumber
itu yang saya lewatkan. saya telah menemukan -fparameter dalam ekspor tetapi belum menemukannya dalam kondisi tidak disetel . Terima kasih.
quack quixote
2
@XavierStuvw: unsetbukan perintah eksternal, ini adalah bagian dari shell ( bash dalam kasus ini); coba man bashdan temukan entri untuk unset(pengelolaannya cukup besar, unsetada di bawah Shell Builtin Commandsbagian).
Chris Johnsen
4

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

Tidak ada unset --helpatau pun man unsetsayangnya.

XavierStuvw
sumber
4
Tidak ada man unsetkarena merupakan built-in command dan untuk built-in perintah ada gantinya help. Untuk beberapa perintah built-in itu ada executable eksternal juga. Jika ragu coba misalnya type mycommnad. Misalnya type unsetdan itu akan menjawab Anda unset is a shell builtin. Jika Anda ingin tahu apakah itu ada, executable juga coba which echo(lain-buikt-in) dan ia akan mengatakan di mana itu. Ini --option_longadalah khas dari perintah yang dapat dieksekusi. Coba echo --helpdan /bin/echo --help. :-).
Hastur
@Hastur Jangan ragu untuk menambahkan komentar Anda ke jawaban dengan mengedit ekornya. Jika pengulas menyetujuinya, Anda akan diberikan 2 poin.
XavierStuvw
1
... terima kasih atas pemikiran Xavier: itu lebih untukmu daripada menyelesaikan jawabannya; Saya kira Anda tidak terjawab bahwa itu sebuah built-in command dan bagi mereka Anda harus menggunakan helpbukan man. (Tidak terlalu benar karena Anda menemukannya man bashdi bab SHELL BUILTIN PERINTAH atau langsung dengan man BASH-BUILTINS...). Sangat nyaman bahwa di bawah shell bash Anda hanya bisa meminta helpdan Anda akan menerima daftar built-in command :-). (Coba help helpdan man manjuga).
Hastur
1
@Hastur Anda dapat melengkapi jawaban untuk kepentingan semua pembaca. Kemudian kita dapat menghapus komentar untuk membuat kekacauan kecil-cetak yang baik.
XavierStuvw
0

Saya baru-baru ini ingin sepenuhnya menghapus nvmdan menginstalnya kembali, dan menyingkirkan lingkungannya. Ternyata menyingkirkan itu sepertinya tidak banyak karena nvmsebagian diimplementasikan sebagai sejumlah muatan fungsi shell yang bersumber ke dalam shell Anda melalui .bash_profileatau .bashrc, atau di mana pun Anda menambahkan perintah-perintah sumber yang diperintahkan kepada Anda saat pertama kali menginstalnya.

Bingung pada awalnya dengan which nvmtidak mengembalikan apa pun dengan jelas nvmperintah dan yang lain masih ditemukan, saya akhirnya menemukan declare -Fbahwa itu adalah sekelompok fungsi shell. Saya tidak ingin hanya membunuh shell dan memulai yang baru (karena alasan yang tidak relevan di sini), jadi saya membersihkan nvmfungsi dari shell itu dengan ini:

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

Beberapa variasi yang mungkin bermanfaat bagi seseorang di luar sana yang karena alasan apa pun ingin melakukan sesuatu yang serupa dan tidak dapat memulai kembali shell baru atau tidak mau.

slowkoni
sumber