1

それらすべてを検索し、ループして設定を解除しようとしていますが、運が悪かったので、関数の設定を解除しようとしています。

非ループウェイが機能する(bar_が作成および設定解除される例)

function bar_ { echo "bar"; }
function_name="bar_"
echo -n "before unset found function: --> "
declare -F $function_name || echo "<not found>"
unset -f $function_name
echo -n "after unset found function: --> "
declare -F $function_name || echo "<not found>"
echo ""

ただし、ループで設定を解除すると、それ自体を削除できません

function foo_ { echo "bar"; }
declare -F | cut -d" " -f3 | grep foo_ | while read function_name
do
    echo -n "before under found function: --> "
    declare -F $function_name || echo "<not found>"
    unset -f ${function_name}
done
echo -n "after unset found function: --> "
declare -F foo_ || echo "<not found>"
echo ""

これはスコープの問題ですか?unsetステートメントをevalでラップしてみましたが効果はありません。

4

3 に答える 3

2

ここでの問題はループではなく、パイプです。このようにしてみてください:

function foo_ {
 echo "bar"
}

while read function_name
do
    echo -n "before under found function: --> "
    declare -F $function_name || echo "<not found>"
    unset -f ${function_name}
done <  <( declare -F | cut -d" " -f3 | grep foo_ )

echo -n "after unset found function: --> "
declare -F foo_ || echo "<not found>"
echo ""

これは、bash プロセス置換を使用します。または、ここで一時ファイルまたはコプロセスを使用することもできます。

于 2011-06-14T00:55:10.490 に答える
1

パイプラインがある場合、パイプラインはサブシェルにあり、変数ごとに外側のシェルに影響を与えることはできません。時々非常に迷惑です。

あなたの解決策:コマンドを出力し(echo "unset -f $function_name")、ループの出力を評価します。

于 2011-06-14T00:50:24.263 に答える
1

Bash ビルトインを使用するとcompgen、サブシェルの問題を回避できます。

IFS=$' \t\n'
unset -f $(compgen -A function foo_)

関連するメモとして、 を使用して単一コマンドの関数検索をオフにすることができますenv -i

ls() { echo 'Hello, world!'; }

ls

env -i ls
于 2011-06-14T10:34:55.477 に答える