/tmp/test
매초마다 파일에 숫자 + 작은따옴표를 쓰는 다음 프로세스가 있다고 가정해 보겠습니다.
for i in {1..1000} ; do echo $i\' ; sleep 1 ; done > /tmp/test
tail -f
그런 다음 다른 기능을 통해 사용하고 실행하고 싶습니다 . 테스트 목적으로 다음을 사용하고 있습니다 echo
.
tail -f /tmp/test | xargs echo
이로 인해 다음과 같은 오류가 발생합니다(입력에 따옴표 없이 실행하면 문제 없음).
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
방정식에 sed를 추가하면 전혀 결과가 나오지 않습니다.
tail -f /tmp/test | sed "s/['\"]//g" | xargs echo
추가한 후 출력을 얻지 못하는 이유나 sed
입력하기 전에 입력에서 따옴표를 제거하는 방법에 대한 아이디어가 있습니까 xargs
?
답변1
많은 것들이 있습니다.
첫째: "tail -f"는 완료되지 않으므로 "xargs"도 마찬가지로 무기한으로 계속 실행됩니다. 두 번째 창을 열어 "tail -f" 프로세스를 "kill -HUP"하여 "tail -f" 및 "xargs"를 완료하여 출력을 생성할 수 있습니다.
둘째: "xargs"는 입력을 버퍼링하고 "전체 버퍼"라고 생각되는 것을 얻지 못합니다. 따라서 1000초 표시가 출력될 때 echo 명령을 한 번도 실행하지 않았습니다. "xargs"가 각 입력 행에 대해 개별적으로 echo를 실행하도록 하려면 xargs에 "-n 1" 옵션을 추가해야 합니다.
작은 따옴표를 좋아하지 않는 "xargs"의 경우 "-d '\n'" 옵션을 사용하여 따옴표 처리를 비활성화하고 입력 인수만 개행으로 구분할 수 있습니다.
답변2
아마도
tail -f /tmp/test | sed "s/['\"]//g" | while read line; do
do_something "$line"
done