STDIN에서 줄을 읽고 처리해야 합니다. 다음과 같이 할 수 있습니다.
<print lines to STDOUT> | while read line; do
<process $line>
done
그러나 이것이 의미하는 바는첫 번째모든 라인이 인쇄되고 파이프됩니다.그 다음에처리됩니다. 나는 다음 줄이 STDOUT으로 전송되기 전에 각 줄을 즉시 처리하고 싶습니다.
행이 생성될 때(예: 로그 파일) 처리해야 하는 경우 유용할 수 있습니다. 내 임무는시바(경고! 이 페이지는 Firefox와 충돌합니다...) 여러 개의 QR 코드를 스캔하고 Firefox에서 해당 URL을 엽니다. 실행 중인 경우 zbarcam --raw
웹캠을 사용하여 QR 코드를 스캔합니다. QR 코드가 발견되면 URL이 즉시 STDOUT에 인쇄되지만 zbarcam은 종료되지 않습니다. 그래서 나는 이 줄을 읽고 여기저기 돌아다니고 싶습니다 firefox $url
(그러나 다른 URL을 기다리지는 않습니다).
내가 찾은떨어져 있는, 하지만 이 작업을 더 쉽게 수행할 수는 없는지 궁금합니다. 기본적으로 그는 zbarcam
임시 파일 에 출력을 쓰고 그 안에 뭔가가 기록될 때까지 기다립니다.
zbarcam --raw > tmpfile &
...
while [[ ! -s $tmp ]] ; do
sleep 1
done
임시 파일이나 루프 없이 이 작업을 수행할 수 있습니까 sleep 1
?
답변1
첫 번째 시도는 성공했습니다.
tail -f temp.file | while read LINE; do firefox $LINE; done
그런 다음 다른 터미널에서 tail -f가 STDOUT에 한 줄을 인쇄하도록 임시 파일에 추가합니다.
echo 'google.com' >> temp.file
Firefox는 이 작업을 수행할 때마다 새 탭을 엽니다.
답변2
몇 가지 노력 끝에 부분적인 해결책을 찾았습니다.
zbarcam --raw|xargs -L1 firefox
핵심 부분은 하나의 행만 읽도록 -L1
지시하는 매개변수입니다. xargs
첫 번째 QR 코드를 읽은 후 Firefox를 실행합니다. zbar
그런 다음 여전히 실행되지만 두 번째 QR 코드를 스캔할 수 없습니다( xargs
어떻게든 다시 호출해야 함).
답변3
매우 가깝습니다:
zbarcam --raw | xargs -n 1 chromium-browser
이것은 나에게 잘 작동하며 각 스캔은 새 탭에서 끝납니다.