私の.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内でのみ表示する方法はありますか?
.bashrc
の最後の行としてunset
を使用します:
unset -f do_stuff
関数do_stuff
を削除/設定解除します。
変数を削除/設定解除するには、次のように呼び出します。
unset variablename
他のオプションは、他のスクリプト言語のようにアンダースコアを使用して、この関数を公開する意図がないことを示すことです。 _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
の「mise en abime」の威力は、驚異的な驚異の源です。