web-dev-qa-db-ja.com

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」名がスコープ内にあるため、タブ補完してその関数を実行できます(環境変数がめちゃくちゃになる可能性があります)。 「do_stuff」を.bashrc内でのみ表示する方法はありますか?

40
hugomg

.bashrcの最後の行としてunsetを使用します:

unset -f do_stuff

関数do_stuffを削除/設定解除します。

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

unset variablename
42
chaos

他のオプションは、他のスクリプト言語のようにアンダースコアを使用して、この関数を公開する意図がないことを示すことです。 _do_fooと入力する可能性はかなり低く、他のユーザーと競合する可能性もほとんどありません。

15
Sean Perry

私が考えることができる唯一の解決策はそれを強調し、それにかなりユニークな名前を付けます、おそらくファンシーパンツ言語のようなドットでそれをネームスペースにさえします( しかし、これはあなたがたは古いものでは機能しませんsh ) 。

ヘック、これは何の衝突もないでしょう:

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

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

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

サブシェルの標準出力に別のスクリプトを作成し、必要な唯一の副作用を(here document <<SIDEを使用して)作成します。次に、.を使用して調達します。

shの「mise en abime」の威力は、驚異的な驚異の源です。

1
Champignac