LINUX.ORG.RU

[bash][любителям детективов] После второго канала (pipe) данные «утекают»

 


0

1

Есть приложение julius, которое на stdout шлет текст, который оно распознало с микрофона. Я грепаю вывод для очистки от ненужных сообщений:

(ниже «<<< please speak >>>» выводится как-то хитро через curses - то появляясь, то изчезая)

Сразу после включения:
$ ./julius-start.sh | grep 'sen' 
<<< please speak >>>


После голоса в микрофоне:

$ ./julius-start.sh | grep 'sen' 
sentence1: <s> PHONE JOE </s>
<<< please speak >>>


Снова бзданул в микрофон:

$ ./julius-start.sh | grep 'sen' 
sentence1: <s> PHONE JOE </s>
sentence1: <s> DIAL OH </s>
<<< please speak >>>

Итак, все нормально - вывод грепается.

Теперь, если я просто подключу второй греп (который 100% сработает) - вывода никакого нет:


После продолжительных пердений в микрофон и мигания строки "<<< плз говорите >>>".

$ ./julius-start.sh | grep 'sen' | grep 'ten'
<<< please speak >>>

Я не понимаю, что здесь происходит.

Далее я написал такую утилиту:

$ cat omg.c
main()
{
	char buf[128];
	while (1) {
		memset(buf, 0, 128);
		printf("---1\n");
		read(0, buf, 127);
		printf("---2\n");
		printf("read: '%s'\n", buf);
	}
}

$ gcc omg.c -o omg

и подключил ее к конвейеру:

$ ./julius-start.sh | grep 'sen' | ./omg 
---1
<<< please speak >>>

В результате долгих говорений в микрофон '<< плз бздани >>' мигает (как и положено), но в omg read() блокировался!

Непонимания у меня все больше.

На всякий случай сделал еще так:

$ ./julius-start.sh | ./omg 
---1
---2
read: 'STAT: include config: julian.jconf

'
---1
---2                
read: 'pass1_best: <s>
sentence1: <s> DIAL TWO </s>
'
---1
<<< please speak >>>^[[A^C

- то есть, все ОК.

Но даже конвейер omg -> omg:

$ ./julius-start.sh | ./omg | ./omg 
---1
<<< please speak >>>

молчит как партизан.

Собственно, проблема в том, что данные куда-то теряются после второго конвейeра.

Помогите, знающие люди (кого бы скастовать?).

★★

Последнее исправление: bk_ (всего исправлений: 1)
Ответ на: комментарий от AnDoR

Я знаю отличие между ними. Здесь все шлют на stdout, если ты не заметил.

bk_ ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.