Làm cách nào để tạo một hàm cục bộ trong bashrc của tôi?


40

.Bashrc của tôi có một số mã lặp đi lặp lại nên tôi đã sử dụng một hàm để đơn giản hóa nó

do_stuff() {
  local version=$1
  export FOO_${version}_X="17"
  export FOO_${version}_Y="42"
}

do_stuff '5.1'
do_stuff '5.2'

Tuy nhiên, bây giờ khi tôi sử dụng shell của mình, tên "do_ ware" nằm trong phạm vi để tôi có thể hoàn thành tab và chạy chức năng đó (có khả năng làm rối các biến môi trường của tôi). Có cách nào để làm cho "do_ ware" chỉ hiển thị bên trong .bashrc không?


2
Nếu bạn không xuất khẩu, bạn cũng có thể sử dụng ()để tạo một subshell. Một khả năng khác cho các trường hợp đơn giản là sử dụng for version in 5.1 5.2vòng lặp, mặc dù điều này cho phép versionthoát.
Ciro Santilli 心 心

Câu trả lời:


40

Sử dụng unsetnhư dòng cuối cùng trong .bashrc:

unset -f do_stuff

sẽ xóa / bỏ đặt chức năng do_stuff.

Để xóa / bỏ đặt các biến gọi nó như sau:

unset variablename

Là unset thực sự là cách duy nhất ở đây? Chà, tôi đoán rằng nếu tôi sử dụng một cái tên thực sự dài và xấu cho chức năng của mình thì khả năng nó sẽ đụng độ với thứ khác sẽ không lớn đến thế ...
hugomg

Nếu đó là vấn đề kiểm tra frist nếu chức năng tồn tại : if type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fi.
hỗn loạn

8
Điều này sẽ không hoạt động nếu do_stuffđược sử dụng bên trong chức năng khác. Khi bạn gọi chức năng đó, bạn sẽ nhận được bash: do_stuff: command not found. Tôi biết đây không phải là trường hợp chính xác mà op đang nói đến nhưng nó đáng để chỉ ra.
Burhan Ali

Đẹp và POSIX .
Ciro Santilli 心 心

15

Tùy chọn khác là sử dụng dấu gạch dưới như trong các ngôn ngữ kịch bản khác để cho biết bạn không có ý định cho chức năng này được công khai. Khả năng bạn gõ _do_foo là khá nhỏ và cũng không có khả năng xung đột với bất kỳ ai khác.


1
Có, hãy sử dụng "_" để biểu thị ý định có chức năng riêng tư, nhưng điều này không liên quan gì đến xung đột. Bất cứ ai cũng có thể cần "_debug ()" hoặc "_safe_copy ()". Nếu có một cái gì đó giúp tránh xung đột, nó không có gì để làm với dấu gạch dưới.
Alois Mahdal

3

Giải pháp duy nhất tôi có thể nghĩ đến là nhấn mạnh nó và đặt cho nó một cái tên khá độc đáo, thậm chí có thể đặt tên cho nó bằng các dấu chấm như một ngôn ngữ ưa thích ( nhưng điều này sẽ không hoạt động theo cách cũsh ).

Heck, điều này sẽ không có bất kỳ xung đột:

_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
    # Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
    cat <<< `echo $(xargs printf <<< "$1")`; }
}

0

Như được đề xuất trong một bình luận, bạn có thể sử dụng một subshell:

#!/bin/bash

. <(
  do_stuff() {
    local version="$1" valid='^\w+$'

    [[ "$version" =~ $valid ]] &&
      cat <<SIDE               || echo "$FUNCNAME: invalid '$version'" >&2
export FOO_${version}_X=17
export FOO_${version}_Y=42
SIDE
  }

  do_stuff 5.0 # FOO_5.0_X is "not a valid identifier"
  do_stuff 5_1
  do_stuff 5_2
)

do_keep() { :; } # just get sure the report below actually works

set | egrep '(do_|FOO_)' |  sed -e 's,^,set:\x09,'

Chúng tôi xây dựng một tập lệnh khác trên đầu ra tiêu chuẩn con cho hiệu ứng phụ duy nhất mà chúng tôi mong muốn (sử dụng heretài liệu <<SIDE). Sau đó, chúng tôi nguồn với ..

Sức mạnh của 'mise en abime' trong shlà một nguồn kỳ quan đáng sợ.

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.