bashrcでローカル関数を作成するには?

bashrcでローカル関数を作成するには?

私は.bashrcに重複したコードがあり、関数を使用して単純化しました。

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

do_stuff '5.1'
do_stuff '5.2'

ただし、シェルを使用すると、「do_stuff」という名前が範囲内にあるので、タブ補完を使用して関数を実行できます(おそらく環境変数が混乱する可能性があります)。 .bashrc内でのみ「do_stuff」を表示する方法はありますか?

答え1

unset最後の行として使用してください.bashrc

unset -f do_stuff

機能が削除/設定解除されますdo_stuff

変数を削除/設定解除するには、次のように呼び出します。

unset variablename

答え2

別のオプションは、他のスクリプト言語のように下線を使用してこの関数を公開する意図がないことを示すことです。 _do_fooと入力する可能性は非常に低く、他の人と衝突する可能性はありません。

答え3

私が考えることができる唯一の解決策は、これを強調し、非常にユニークな名前を付けることです。たぶんFancy Pants言語(しかし、昔はこれは通じませんでした。sh)。

このように、これはどんなものとも衝突しません:

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

答え4

コメントで提案されているようにサブシェルを使用できます。

#!/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,'

私たちが望む唯一の副作用を達成するために、サブシェル標準出力に別のスクリプトを書いてください(heredocumentを使用<<SIDE)。それから.

「美装アビメ」の力はsh恐ろしい驚異の源泉です。

関連情報