Execute comando complexo a partir do script bash

1

Estou trabalhando com o kafka e quero monitorar tópicos. Basicamente eu produzi vários tópicos para stdout e para arquivar para revisão posterior. Para o monitoramento de um único tópico, criei o seguinte comando:

${KAFKA_HOME}/bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic mytopic | \
    while IFS= read -r line; do 
      printf '[%s | %20s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "mytopic" "${line}";
    done | tee -a kafka.out

No entanto, há muitos tópicos para consumir, por isso estou tentando fazer algo como

consumer=${KAFKA_HOME}/bin/kafka-console-consumer.sh
mapfile -t topics < <(${KAFKA_HOME}/bin/kafka-topics.sh --zookeeper localhost:2181 --list)
for i in ${topics[@]}; do
  xterm -T ${i} -e "my_command" &
done
tail -F kafka.out

em que my_command é o comando acima. Não funciona Eu suspeito que estou bagunçando citações, infelizmente não consigo descobrir como aplicá-las corretamente

    
por Alexander Zhak 24.08.2016 / 14:47

1 resposta

2

Se você quiser armazenar algum texto na íntegra, geralmente é mais fácil com esta sintaxe:

mycommand=$(cat << 'EOF'
"${KAFKA_HOME}/bin/kafka-console-consumer.sh" --zookeeper localhost:2181 --topic "$TOPIC" |
  while IFS= read -r line; do 
    printf '[%s | %20s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$TOPIC" "${line}";
  done | tee -a kafka.out
EOF
)

Em ksh93 , bash ou zsh , você também pode:

mycommand=$(<<'EOF'
....
EOF

Em ksh93 que otimiza o exec de cat e o fork, enquanto com bash apenas o exec (em zsh , não faz diferença).

Em mksh :

mycommand=<<'EOF'
...
EOF

E então:

export TOPIC KAFKA_HOME
for TOPIC in "${topics[@]}"; do
  xterm -T "$TOPIC" -e "$mycommand" &
done

Aqui, eu usaria ts para marcar a entrada da hora (ou fazê-lo em gawk ou perl se ts não estiver disponível) em vez desse% ineficientewhile read loop.

ts '[%F %T | mytopic]'
    
por 24.08.2016 / 16:58