回答:
のunset
最後の行として使用します.bashrc
:
unset -f do_stuff
関数を削除/設定解除しますdo_stuff
。
変数を削除/設定解除するには、次のように呼び出します。
unset variablename
if type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fi
。
do_stuff
別の関数内で使用されている場合、これは機能しません。その関数を呼び出すと、が取得されbash: do_stuff: command not found
ます。これは、OPが話していた正確なケースではないことはわかっていますが、指摘する価値はあります。
他のオプションは、他のスクリプト言語のようにアンダースコアを使用して、この関数を公開するつもりがないことを示すことです。_do_fooと入力する可能性は非常に小さく、他の人と競合する可能性も低いです。
私が考えることができる唯一の解決策は、下線を引いてかなりユニークな名前を付けることです。ファンシーパンツ言語のようなドットで名前空間を付けることもできます(しかし、これはあなたがたは古いものでは動作しませんsh
)。
ちなみに、これには競合はありません。
_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
# Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
cat <<< `echo $(xargs printf <<< "$1")`; }
}
コメントで提案されているように、サブシェルを使用できます。
#!/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
恐ろしい驚異の源です。
()
、サブシェルの作成にも使用できます。単純な場合の別の可能性は、for version in 5.1 5.2
ループを使用することですが、これによりversion
エスケープできます。