Если я правильно понял вашу проблему, это должно сработать:
sed '/-$/ {N;s/-\n / /}' your_file.qdp
//1./a.out
:
Если вы не выполняете перенаправление стандартного ввода (без канала и без <
), стандартный ввод наследуется от родительского процесса. Когда вы запускаете a.out
в интерактивном режиме в оболочке, он наследует терминальное устройство, которое получает ваш ввод с клавиатуры как стандартный ввод.
Терминальные устройства обычно недоступны для поиска, потому что они представляют взаимодействие с пользователем, но в соответствии со стандартом POSIX lseek
могут возвращать успех и просто ничего не делать. В Linux lseek
завершается с ошибкой ESPIPE
.
//2./a.out < /etc/passwd
:
Здесь стандартный ввод перенаправляется на открытый файл. Поскольку /etc/passwd
должен быть обычным файлом, его можно найти.
//3 cat < /etc/passwd |./a.out
:
Здесь вы запускаете два процесса(cat
и./a.out
)и соединяете их каналом.
cat
(без других аргументов )читает его на стандартный ввод(/etc/passwd
)и копирует в свой стандартный вывод (канал, соединяющийся с./a.out
). Это не то же самое, что //2
. С точки зрения ./a.out
stdin не может искать, потому что это всего лишь канал, соединяющий другой процесс.
//4./a.out < /var/spool/cron/FIFO
:
Здесь у вас есть именованный канал или аналогичный специальный файл. Этот случай подобен //3
. У вас есть однонаправленное соединение с другим процессом. И эти не доступны для поиска.