Loop infinito? Aparentemente causado por código inócuo

0

Eu tenho essa função 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
}

quando eu ligo, minha rotina congela, parece que está entrando em um loop infinito.

Quando altero meu código para isso, funciona:

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
}

Então, talvez eu não precise aparar o espaço em branco para verificar os caracteres correspondentes? Espero que sim, porque a primeira função não parece funcionar, não tenho certeza porque parece entrar em um loop infinito ..

    
por Alexander Mills 02.05.2018 / 08:38

2 respostas

3

Este não é um ciclo infinito, é

tr -d "$dr"

esperando por entrada.

Não sei exatamente o que você está tentando fazer lá. Se você quiser usar tr para excluir caracteres de um valor armazenado em uma variável, precisará fornecer o valor:

tr -d " " <<<"$dr"

excluiria todos os espaços do valor armazenado em dr .

    
por 02.05.2018 / 08:46
1

Um problema com o seu código é esta linha

local dr_trimmed="$(tr -d "$dr")"

Suponho que $dr seja um intervalo de caracteres para tr excluir de stdin , mas você esqueceu de fornecer tr com todos os dados a serem processados. Então está lá esperando por alguns.

    
por 02.05.2018 / 08:46