Bir bash işlevini nasıl ayarlayabilir veya kaldırabilirim?


33

Ayarlayabilir veya bash bir ortam değişkeni dışa aktarırsanız, şunları yapabilirsiniz unset onu. Bash'de bir takma ad ayarlarsanız, hizalamayı kaldırabilirsiniz . Ancak bir işlev bozukluğu yok gibi görünüyor .

Bir yer, örneğin bu (önemsiz) darbe işlevi, göz önünde .bash_aliases dosyası ve kabuk başlatma okunmuştur.

function foo () { echo "bar" ; }

Bu işlev tanımını mevcut kabuğumdan nasıl temizleyebilirim?
(Başlatma dosyalarının değiştirilmesi veya kabuğun yeniden başlatılması sayılmaz.)


Tüm söylenenler, unfunctionbir komut için güzel bir isim olurdu :-)
Joey

@Johannes Rössel: zsh var.
Chris Johnsen

Hm, gerçekten. Yine de, PowerShell'in tüm bunları biraz daha sezgisel ve tutarlı bir şekilde ele alma yolunu buluyorum :-)
Joey

Yanıtlar:


50

ayarlanmazsa yerleşik komutu bir seçenek alır -f, silme işlevlerine:

unset -f foo

Form unset girişi bash manpage:

-F belirtilirse, her ad bir kabuk işlevine karşılık gelir ve işlev tanımı kaldırılır.

Not: -fyalnızca aynı ada sahip bir değişken varsa gerçekten gereklidir. Ayrıca adlı bir değişken var yoksa foo, o zaman unset foofonksiyonunu silecektir.


eksik olan buydu. ben -fparametre ihracatta bulmuştu ama unset bulamamıştı . Teşekkürler.
quack quixote

2
@XavierStuvw: unsetharici bir komut değildir, kabuğun bir parçasıdır ( bu durumda bash ); man bashgirişini bulmaya çalışın unset(yönetmek oldukça büyük, bölümün unsetaltındadır Shell Builtin Commands).
Chris Johnsen

4

Bakınız 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.

Ne ne unset --helpde ne man unsetyazık ki var.


4
Yok man unseto çünkü dahili komuta ve için dahili komutları yerine orada help. Bazı yerleşik komutlar için harici bir yürütülebilir dosya da vardır. Şüphe durumunda, örneğin deneyin type mycommnad. Örneğin type unsetve size cevap verecektir unset is a shell builtin. Eğer yürütülebilir olup olmadığını bilmek istiyorsanız which echo(başka bir buikt-in) deneyin ve nerede olduğunu söyleyecektir. --option_longYürütülebilir komutunun tipiktir. Deneyin echo --helpve /bin/echo --help. :-).
Hastur

@Hastur Kuyruğunu düzenleyerek cevaba yorumunuzu eklemekten çekinmeyin. Hakemler bunu onaylarsa, size 2 puan verilecektir.
XavierStuvw

1
... düşünce Xavier için teşekkürler: cevabı tamamlamak sizin için daha fazlaydı; Sanırım bunun yerleşik bir komut olduğunu ve onlar helpyerine kullanmak zorunda olduğunuzu kaçırdınız man. (Gerçekten doğru değil çünkü onları SHELL BUILTIN COMMANDSman bash bölümünde veya doğrudan ile bulabilirsiniz ...). Bir bash kabuğunun altında basitçe isteyebileceğiniz ve yerleşik komutların listesini alacağınız rahattır . (Deneyin ve çok). man BASH-BUILTINShelp:-)help helpman man
Hastur

1
@Hastur Cevabı tüm okuyucuların yararına olacak şekilde tamamlayabilirsiniz. Sonra küçük baskı karmaşasından kurtulmak için yorumları silebiliriz.
XavierStuvw

0

Son zamanlarda tamamen kaldırmak nvmve yeniden yüklemek ve ortamlarından herhangi birinden kurtulmak istedim . Ondan kurtulmanın, nvmkısmen veya kısmen kabuğunuza kaynaklanmış bir kabuk işlevi olarak .bash_profileveya .bashrcyüklediğiniz ilk komutları eklediğiniz her yerde eklediğiniz bir kabuk yükü olarak uygulandığı görülmemektedir .

İlk başta which nvmhenüz açıkça hiçbir şey döndürerek şaşkına döndü nvmve diğerleri hala bulunuyordu, sonunda declare -Fbir grup kabuk işlevi olduğunu keşfettim . Ben sadece kabuğu öldürmek ve (burada alakalı olmayan nedenlerle) yeni bir tane başlatmak istemiyordu, bu yüzden nvmbu kabuk bu fonksiyonları dışarı temizledi :

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

Bununla ilgili bazı varyasyonlar, herhangi bir nedenden dolayı benzer bir şey yapmak isteyen ve yeni bir kabuğu yeniden başlatamayan veya istemeyen birisine yardımcı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.