bashrcでローカル関数を作成するにはどうすればよいですか?


40

.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」を表示する方法はありますか?


2
エクスポートを必要としなかった場合は()、サブシェルの作成にも使用できます。単純な場合の別の可能性は、for version in 5.1 5.2ループを使用することですが、これによりversionエスケープできます。
Ciro Santilli新疆改造中心法轮功六四事件

回答:


40

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

unset -f do_stuff

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

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

unset variablename

ここで設定解除が本当に唯一の方法ですか?さて、私は...私は本当に長い使用して、私の機能のための醜い名前場合は何か他のものと衝突、それのチャンスはそれほど大きくはならないだろうと思います
hugomg

それが問題である場合、関数が存在する場合は最初に確認してくださいif type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fi
カオス

8
do_stuff別の関数内で使用されている場合、これは機能しません。その関数を呼び出すと、が取得されbash: do_stuff: command not foundます。これは、OPが話していた正確なケースではないことはわかっていますが、指摘する価値はあります。
バーハンアリ14


15

他のオプションは、他のスクリプト言語のようにアンダースコアを使用して、この関数を公開するつもりがないことを示すことです。_do_fooと入力する可能性は非常に小さく、他の人と競合する可能性も低いです。


1
はい、「_」を使用してプライベート機能を持つことを示しますが、これは競合とは関係ありません。誰でも「_debug()」または「_safe_copy()」が必要です。競合の回避に役立つものがある場合、アンダースコアとは関係ありません
アロイスマーダル14年

3

私が考えることができる唯一の解決策は、下線を引いてかなりユニークな名前を付けることです。ファンシーパンツ言語のようなドットで名前空間を付けることもできます(しかし、これはあなたがたは古いものでは動作しませんsh)。

ちなみに、これには競合はありません。

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

0

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

#!/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恐ろしい驚異の源です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.