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]'