tailf 출력을 스크립트 인수로 사용

tailf 출력을 스크립트 인수로 사용

다음 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 TestSlack 채널에 "test"라는 단어가 게시됩니다.

답변1

문제는 message.sh명령이 시작되지 않는다는 것입니다. 셸은 $(...)결과를 인수로 전달하기 위해 먼저 명령을 평가해야 하지만 사용 중인 작업은 tailf끝이 없습니다. 이것을 다음과 비교해보세요:

ls $(echo hello;sleep 10) & sleep 1; ps

아직 시작되지 않았 ps음을 표시 하며 완료되고 부분적으로 완료된 경우에만 인수를 가져옵니다 .lshellosleep 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

관련 정보