다음 tailf를 실행하면 왜 이런 일이 발생합니까?
tailf /var/log/z-way-server.log | grep --line-buffered device-info | gawk 'BEGIN { FS = "\"" } ; {print $4,"is",$8}'
원하는 출력을 얻습니다.
Den Window Sensor is off
그러나 이를 스크립트에 매개변수로 전달하려는 경우(스크립트에서 $1 사용):
./message.sh $(tailf /var/log/z-way-server.log | grep --line-buffered device-info | gawk 'BEGIN { FS = "\"" } ; {print $4,"is",$8}')
예상대로 메시지를 전달하지 않습니까? 명확한 설명을 위해 message.sh Test
Slack 채널에 "test"라는 단어가 게시됩니다.
답변1
문제는 message.sh
명령이 시작되지 않는다는 것입니다. 셸은 $(...)
결과를 인수로 전달하기 위해 먼저 명령을 평가해야 하지만 사용 중인 작업은 tailf
끝이 없습니다. 이것을 다음과 비교해보세요:
ls $(echo hello;sleep 10) & sleep 1; ps
아직 시작되지 않았 ps
음을 표시 하며 완료되고 부분적으로 완료된 경우에만 인수를 가져옵니다 .ls
hello
sleep 10
$()
답변2
큰따옴표로 전달해 보세요. 운영 체제가 timeout 명령을 지원하는 경우 timeout을 사용해 보십시오(아래 게시물 참조).
https://stackoverflow.com/questions/10430126/how-to-stop-tail-f-command-executed-in-sub-shell
시간 초과를 원하지 않으면 이것을 시도하십시오
#!/bin/bash
tailf /var/log/z-way-server.log | grep --line-buffered device-info | gawk 'BEGIN { FS = "\"" } ; {print $4,"is",$8}' | while read line
do
/absolute/path/of/message.sh "${line}"
done