Alternativa para processar o pipeline

2

O script de shell no qual estou trabalhando está tendo uma consulta SQL que obtém várias colunas e várias linhas do banco de dados:

get_names() {
    $ORACLE_HOME/bin/sqlplus -s usr/pwd <<EOF
        SELECT id,name,age FROM table;
        Exit;
EOF
}

Então, para ler este resultado, estamos direcionando a saída da função:

get_names | while read sid p_name p_age ; do ... done .

Agora, por causa de | , uma subshell está sendo criada, o que preciso evitar. Existe alguma alternativa presente para este problema?

Queremos quebrar essa instrução pipe para evitar o processo filho dela.

    
por vidya31 21.07.2016 / 15:12

2 respostas

3

Você pode usar a substituição de processo se estiver em um shell compatível (por exemplo, bash, ksh ou zsh):

while read sid p_name p_age ; do ...; done <  <(get_names)

Isso é necessário no bash se você quiser que o link final do seu pipeline seja o shell em execução (para que ele possa ter um efeito no shell em execução):

for sh in bash ksh zsh; do 
     echo $sh:; $sh -c 'while read var; do i=$var
     done < <(printf "%s\n" 1 2); echo $i '
done

Saída:

bash:
2
ksh:
2
zsh:
2

Considerando que com um pipeline regular:

for sh in bash ksh zsh; do 
     echo $sh:; $sh -c 'printf "%s\n" 1 2 | 
         while read var; do i=$var; done ; echo $i '; 
done

a atribuição não é suficiente porque o bash executa o loop while em um subshell, em vez do shell atual:

bash:

ksh:
2
zsh:
2
    
por 21.07.2016 / 16:35
-1

Você pode fazer tudo em um único processo python (outros idiomas estão disponíveis).

    
por 21.07.2016 / 16:32

Tags