Чтение трубы разрушительно; нет возможности искать по трубе:
ESPIPE (29): Illegal seek
Номер ошибки взят из MacOS X, но имя является традиционным (и обязательным для POSIX) и указывает, откуда исходит ограничение.
Итак, если вы хотите повторно обработать ввод в сценарии оболочки, вам нужно спрятать стандартный ввод в файл, чтобы вы могли обработать его:
tmp=${TMPDIR:-/tmp}/xx.$$ # Consider mktemp or something
trap "rm -f $tmp.1; exit 1" 0 1 2 3 13 15 # Exit, HUP, INT, QUIT, PIPE, TERM
tee $tmp.1 |
while read -a linA
do
...
done
...reprocess $tmp.1 here...
rm -f $tmp.1
trap 0
exit $exit_status
Единственная ловушка, которую нужно посмотреть, это то, что из-за конвейера переменные, установленные в цикле while
, не доступны в родительской оболочке. Если это проблема, вы можете использовать:
tee $tmp.1 |
{
while read -a linA
do
...
done
...reprocess $tmp.1 here...
}
Скобки группируют операторы для целей перенаправления ввода / вывода. Процесс tee
будет завершен из-за EOF, поэтому файл будет завершен, когда while read
обнаружит EOF, так что после цикла будет безопасно получить доступ к $tmp.1
.
Единственное, на что нужно обратить внимание, это то, что tee
сделает это безразличным к входу терминала. Файлы не будут проблемой; Вводный канал вряд ли будет проблемой. Однако tee
, вероятно, будет полностью буферизовать свой вывод, а не строковую буферизацию своего вывода, поэтому цикл чтения может ничего не увидеть, пока вы не введете много строк ввода.