Encerrando programaticamente o pipeline / saindo [fechado]

0

Eu tenho um pipeline assim:

  tail -n0 -f  "${my_input}" | ql_receiver_lock_holder | while read line; do
   echo "$line" >> "${my_output}";
   # xxx: how can I programmatically close the pipeline at this juncture?
  done & disown;

minha pergunta: existe uma maneira de fechar programaticamente o pipeline, onde diz xxx? Eu provavelmente poderia apenas chamar exit 0; , mas estou me perguntando se existe uma maneira de fechar o pipeline atual de alguma forma.

    
por Alexander Mills 23.04.2018 / 07:56

1 resposta

2

Em:

tail -n0 -f -- "$my_input" |
  ql_receiver_lock_holder |
  sed /xxx/q > "$my_output"
  • sed sairia depois de ler a primeira linha contendo xxx .
  • ql_receiver_lock_holder , em seguida, sairia (morto por um SIGPIPE) após a primeira gravação que faz para stdout (o tubo agora quebrado) depois disso.
  • Da mesma forma, tail sairia na primeira gravação depois disso.

Se você quiser que ql_receiver_lock_holder e tail saiam assim que sed sair sem esperar pela próxima gravação, você pode usar as abordagens descritas em

Observe que esse tipo de while read loop não é o caminho certo para processar texto em shells . No mínimo, você precisaria de algo como:

while IFS= read -r line; do
  printf '%s\n' "$line"
  case $line in
    (*xxx*) break
  esac
done

para substituir o sed /xxx/q , mas que seria terrivelmente ineficiente, exceto para entradas muito pequenas.

    
por 23.04.2018 / 08:07