Obtém o PID do subshell quando a variável é usada

0

Espero que esse título faça sentido. Eu estou basicamente tentando adicionar uma roda de progresso para um script para exibir enquanto um pull do banco de dados está ocorrendo.

Eu estou chamando uma função de banco de dados genérico que ecoa de volta um resultado que é então armazenado na variável de resultado. Existe alguma maneira que eu possa fundo isso, pegar o PID e depois usar esse PID no spinner esperar?

loading_wheel(){
local process_id="$1"

spin[0]="-"; spin[1]="\"; spin[2]="|"; spin[3]="/"

echo -n "[ Working ] ${spin[0]}"
while kill -0 $process_id 2> /dev/null
do
    for i in "${spin[@]}"
    do
        echo -ne "\b$i"
        sleep 0.1
    done
    done
    echo ""
}

# This is the command I want to background and use whilst still populating the variable.
result=$(get_db_val "$conn" "select 'test' from dual;")

# An example that works but no variable or subshell.
sleep 10 & PID=$!

loading_wheel "$PID"
    
por Matt Damon 07.11.2017 / 17:06

1 resposta

0

Você não pode fazer o background de um subshell e capturar sua saída em uma variável confiável com um constructo como foo=$(some_value_of_bar_that_takes_a_while) & ; você precisará contornar essa limitação. Por uma questão de brevidade:

loading_wheel() {
    # is defined here
}
scratch=$(mktemp); trap "rm -f $scratch" EXIT
get_db_val "$conn" "select 'test' from dual;" > $scratch &
loading_wheel $!
result="$( cat scratch )"
    
por 07.11.2017 / 17:25

Tags