По крайней мере, Linux и BSDs имеют TIOCSTI ioctl для продвижения символов назад к терминальному входному буферу (до предела [4 096 символов на Linux]):
#include <sys/ioctl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
void stackchar(char c)
{
if (ioctl(0, TIOCSTI, &c) < 0) {
perror("ioctl");
exit(1);
}
}
int main(int argc, char *argv[])
{
int i, j;
char c;
for (i = 1; i < argc; i++) {
if (i > 1) stackchar(' ');
for (j=0; (c = argv[i][j]); j++) {
stackchar(c);
}
}
exit(0);
}
Скомпилируйте его и назовите его как:
cmd foo bar < "$some_tty"
продвигать символы назад на некотором tty.
И в жемчуге:
require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV;
Править: Я понимаю теперь, что это - тот же ioctl как в writevt решении. Комментарий и название команды вводят в заблуждение как работы TIOCSTI для любого терминала, не просто VTs.
Должно уже быть достаточно работать
echo $(yes yes)
$(...)
выполняет внутреннюю команду, пока она не закончена и получает весь свой вывод. - Теперь как yes
выполняет долгое время и генерирует большой вывод, удар в конечном счете исчерпает память и катастрофический отказ.