좋아요, 명령에서 일부 입력을 듣는 스크립트가 있습니다. 지금까지 도착한 모든 것을 조작 할 수 있기를 원하지만 궁금해하기 시작합니다. read
으로도 가능하다면 대신, 당신이 볼 수 있듯이 16 자 사용할 수있을 때의 read_output
기능은 텍스트를 인쇄 할사용 가능한 문자 만 읽음
#!/bin/bash
long_running_task() {
i=0
while [ $i -lt 10 ]; do
i=$(($i + 1))
printf '%s' "Task $i "
sleep 1
done
}
read_output() {
status=0
while [ $status = 0 ]; do
IFS='' read -rd '' -n 16 text; status=$?
[ -z "$text" ] && continue
printf '%s %s' "(${#text})" "$text"
done
echo
}
long_running_task | read_output
(또는 입력의 끝에 도달) : 여기
무슨 뜻인지의 예 사용할 수있는 것을 인쇄합니다.불행히도 장시간 실행되는 작업의 출력을 제어 할 수 없기 때문에 단순히 다른 구분 기호를 선택할 수는 없습니다. 현재 내가 알고있는이 문제를 해결할 수있는 유일한 방법은 read
한 번에 하나의 문자 만 가져 오는 것입니다.하지만 이것은 대단히 비효율적입니다.
read
또는 그 밖의 다른 방법으로 입력을 가져올 수있는 방법이 있습니까?하지만 입력이 끝났는지 여부를 감지 할 수있는 방법을 제공합니다 (단순히 아니오 출력은 아직 캡처 할 수 있습니까?)
내가 현재 작업하고있는 환경은 bash
입니다. 따라서 모든 bash 관련 솔루션을 허용 하겠지만 휴대용 옵션이있는 경우 해당 옵션도 볼 수 있습니다. 합리적인 시간 내에 명령이 반환되는 경우 명령이 얼마나 빨리 리턴되는지는 중요하지 않습니다 (그래서 몇 초마다 출력을 조회 할 수 있습니다).
[편집] 문제에 대한 혼란 거기 때문에, 나는 더 많은 기능 예를 제공하려고합니다 : 아직도
#!/bin/bash
long_running_task() {
i=0
while [ $i -lt 10 ]; do
i=$(($i + 1))
printf '%s' "Waiting $i second(s)… "
sleep $i
printf '%s\n' 'done.'
done
}
NL=$'\n'
log() {
status=0
while [ $status = 0 ]; do
IFS='' read -rd '' -n 16 text; status=$?
[ -z "$text" ] && continue
printf '%s' "${text/$NL/$NL[$(date +%R)] }"
done
}
long_running_task | log
조금 단순한,하지만 당신이 볼 수있는이 긴 출력을합니다 실행중인 작업과 프로세스 new-lines은 필요로하는 줄의 시작 부분에 타임 스탬프를 추가합니다. 그것은 완벽하지는 않지만 잘하면 기본 아이디어를 제공합니다. 이것은 실제로하고 싶은 것이 아니지만 새로운 라인을 처리해야하며 불행히도 이것이 유일한 방법 인 것 같습니다. read
으로 기다리면 반응이 충분하지 않습니다.
내가하려는 일을 이해했다면 관심있는 크기로'16'을 줄여야합니다. 인쇄하고자하는 것보다 작 으면'read_output '읽는 문자가 어떤 값을 만족시키고 그 다음에 합계를 인쇄 할 때까지. 별도의 파일 설명자 (예 : 임시 파일)에 각 문자를 기록하고 증분 값에 관심이있는 경우 임시 파일을 들여다 볼 수 있습니다. 네가 좋아하는 것을 찾을 때까지 '16 '의 길이로 놀아 라. 원하는 경우 모든 문자를 '1'로 읽을 수 있습니다. –
당신이 달성하려고하는 것을 쉽게 알 수 있도록 예상 출력을 줄 수 있습니까 – Ram
bash에서 비동기 읽기가 필요합니다. 읽기에는 시간 초과 옵션이 있습니다. 짧은 시간에 원하는대로 사용할 수 있습니다. – user3132194