как читать куски из именованного канала в Bash - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть команда, которая потенциально выводит много данных на стандартный вывод, и мне нужно загрузить их через ftp в удаленное местоположение.

Я нашел этот вопрос Выгрузить вывод программы непосредственно вудаленный файл по ftp , и мне очень понравилась идея перенаправить вывод в именованный канал, а затем прочитать ненужные файлы из него.однако, как только я прочитал первый блок через dd, команда, вводимая в канал, просто завершается, и больше нет данных для чтения из канала.

, чтобы проверить это, я создал fifo

#> mkfifo fifo

затем я написал в fifo на одной оболочке:

#> echo bla  > fifo

, а на другой оболочке я прочитал с нее:

#> dd if=fifo of=spool.1 bs=1 count=1

выводит первый байт в спул.1 изатем команда, записывающая в канал, завершается, и я не могу прочитать оставшиеся данные из канала.

Я хотел бы прочитать следующий фрагмент из этого канала, но не могу понять, что я делаю неправильно

есть идеи, как сохранить этот канал открытым, пока все данные не будут считаны из него?

1 Ответ

0 голосов
/ 17 декабря 2018

dd необходимо читать со стандартного ввода, а не открывать и закрывать сам канал, чтобы держать конец записи открытым для echo.Как только конец записи закрыт, вы не можете снова открыть конец чтения.

Например,

{ 
  dd of=spool.1 bs=1 count=1
  dd of=spool.2 bs=2 count=2
  dd of=spool.2 bs=2 count=2
} < fifo

fifo открывается один раз для составной команды {...}, и каждый вызов dd наследует один и тот же дескриптор открытого файла, не закрывая его.

...