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、または次のこともできますbashzsh

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

ここで、ksh93catとforkのexecは最適化され、bashexecのみが最適化されます(ではzsh違いはありません)。

存在するmksh

mycommand=<<'EOF'
...
EOF

それから:

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

ここでは、非常に非効率的なループの代わりにタイムスタンプ入力(または利用できない場合は実行ts)を使用します。gawkperltswhile read

ts '[%F %T | mytopic]'

関連情報