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

여기서 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]'

관련 정보