从 bash 脚本执行复杂命令

从 bash 脚本执行复杂命令

我正在与 kafka 合作,我想监控主题。基本上,我将几个主题输出到标准输出并归档以供以后查看。对于单个主题监控,我想出了以下命令:

${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

然而,有很多主题需要消耗,所以我正在尝试做类似的事情

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

my_command上面的命令在哪里。这不起作用。我怀疑我弄乱了引号,不幸的是我不知道如何正确应用它们

答案1

如果您想逐字存储一些文本,使用以下语法通常会更容易:

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
)

ksh93,bash或 中zsh,您还可以这样做:

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

其中ksh93优化了 cat 和 fork 的 exec,而bash仅优化了 exec(在 中zsh,没有区别)。

mksh

mycommand=<<'EOF'
...
EOF

进而:

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

在这里,我会使用ts时间戳输入(或者在gawkperl如果ts不可用时执行),而不是那个效率非常低的while read循环。

ts '[%F %T | mytopic]'

相关内容