我有这个 bash 函数:
botch_get_prev_cd(){
local dr=$(declare -f cd);
local dr_trimmed="$(tr -d "$dr")"
if [[ "$dr_trimmed" != *"run_botch"* ]]; then
definition_prev_cd="prev_$dr"
echo "$definition_prev_cd";
eval "${definition_prev_cd}"
unset definition_prev_cd # clean up, no reason to leave this string around
export -f prev_cd
fi
}
当我调用它时,我的例程冻结了,看起来就像进入了无限循环。
当我将代码更改为此时,它会起作用:
botch_get_prev_cd(){
local dr=$(declare -f cd);
if [[ "$dr" != *"run_botch"* ]]; then
definition_prev_cd="prev_$dr"
echo "$definition_prev_cd";
eval "${definition_prev_cd}"
unset definition_prev_cd # clean up, no reason to leave this string around
export -f prev_cd
fi
}
所以也许我不需要修剪空格来检查匹配的字符?我希望如此,因为第一个函数似乎不起作用,不知道为什么它似乎进入无限循环。
答案1
这不是无限循环,而是
tr -d "$dr"
等待输入。
我不确定你到底想在那里做什么;如果要使用tr
从存储在变量中的值中删除字符,则需要为其指定值:
tr -d " " <<<"$dr"
将从存储在 中的值中删除所有空格dr
。
答案2
您的代码有一个问题是这一行
local dr_trimmed="$(tr -d "$dr")"
我假设这是要删除的$dr
字符范围tr
标准输入,但您忘记提供tr
任何要处理的数据。所以它坐在那里等待一些人。