![Bash 스크립트에서 복잡한 명령 실행](https://linux55.com/image/93123/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EB%B3%B5%EC%9E%A1%ED%95%9C%20%EB%AA%85%EB%A0%B9%20%EC%8B%A4%ED%96%89.png)
저는 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
)을 사용합니다 .gawk
perl
ts
while read
ts '[%F %T | mytopic]'