この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
コードの問題の1つは次のようになります。
local dr_trimmed="$(tr -d "$dr")"
私はこれが削除される$dr
文字の範囲であると仮定します。tr
標準入力tr
、処理するデータを提供することを忘れました。だからそこに座って人々を待っています。