Làm thế nào để tôi bỏ đặt hoặc thoát khỏi chức năng bash?


33

Nếu bạn đặt hoặc xuất một biến môi trường trong bash, bạn có thể bỏ đặt nó. Nếu bạn đặt bí danh trong bash, bạn có thể hủy bỏ nó. Nhưng có vẻ không phải là một unfunction .

Ví dụ, hãy xem xét hàm bash (tầm thường) này được đặt trong tệp .bash_aliases và đọc khi khởi tạo shell.

function foo () { echo "bar" ; }

Làm thế nào tôi có thể xóa định nghĩa hàm này khỏi shell hiện tại của tôi?
(Thay đổi tệp khởi tạo hoặc khởi động lại shell không được tính.)


Tất cả những gì đang được nói, unfunctionsẽ là một cái tên hay cho một lệnh :-)
Joey

@Johannes Rössel: zsh có nó.
Chris Johnsen

Hừm, quả thật. Tuy nhiên, tôi thấy cách xử lý của PowerShell với tất cả điều này trực quan và nhất quán hơn một chút :-)
Joey

Câu trả lời:


50

Lệnh unset tích hợp có một tùy chọn -f, để xóa các hàm:

unset -f foo

Hình thành mục chưa đặt trong trang bash :

Nếu -f được chỉ định, mỗi tên tham chiếu đến hàm shell và định nghĩa hàm được loại bỏ.

Lưu ý: -fchỉ thực sự cần thiết nếu một biến có cùng tên tồn tại. Nếu bạn không có một biến có tên foo, thì unset foosẽ xóa hàm.


đó là những gì tôi đã thiếu. Tôi đã tìm thấy -ftham số trong xuất nhưng không tìm thấy nó trong unset . cảm ơn.
quack quixote

2
@XavierStuvw: unsetkhông phải là lệnh bên ngoài, nó là một phần của trình bao ( bash trong trường hợp này); thử man bashvà tìm mục cho unset(phần quản lý khá lớn, unsetnằm trong Shell Builtin Commandsphần).
Chris Johnsen

4

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

Không có cũng không phải unset --helpkhông man unsetmay.


4
Không có man unsetvì nó là một built-in lệnh và cho xây dựng trong các lệnh có thay vào đó là help. Đối với một số built-in lệnh nó tồn tại một thực thi bên ngoài quá. Trong trường hợp nghi ngờ thử ví dụ type mycommnad. Ví dụ type unsetvà nó sẽ trả lời bạn unset is a shell builtin. Nếu bạn muốn biết nếu nó tồn tại thì có thể thực thi được không, hãy thử which echo(một buikt-in khác) và nó sẽ cho biết nó ở đâu. Đây --option_longlà điển hình của lệnh thực thi. Hãy thử echo --help/bin/echo --help. :-).
Hastur

@Hastur Hãy thoải mái thêm nhận xét của bạn vào câu trả lời bằng cách chỉnh sửa đuôi của nó. Nếu người đánh giá chấp thuận, bạn sẽ được thưởng 2 điểm.
XavierStuvw

1
... cảm ơn vì suy nghĩ của Xavier: nó dành cho bạn nhiều hơn là hoàn thành câu trả lời; Tôi đoán bạn bỏ lỡ rằng nó đã được một built-in lệnh và đối với họ bạn phải sử dụng helpthay vì man. (Không thực sự đúng vì bạn tìm thấy chúng trong man bashchương SHELL BUILTIN THÔNG TIN hoặc trực tiếp với man BASH-BUILTINS...). Đó là ấm cúng mà dưới một vỏ bash bạn chỉ có thể yêu cầu helpvà bạn sẽ nhận được danh sách các built-in lệnh :-). (Thử help helpman manquá).
Hastur

1
@Hastur Bạn cũng có thể hoàn thành câu trả lời vì lợi ích của tất cả các độc giả. Sau đó, chúng ta có thể xóa các bình luận để giải quyết vấn đề lộn xộn in nhỏ.
XavierStuvw
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.