Я нашел решение с помощью mkfifo
, который создает именованную трубу, или FIFO.
Проще всего создать символическую ссылку, и можно использовать все перенаправления, разрешенные оболочкой.
mkfifo MyOutput
ls -l
дает
0 prw-r--r-- 1 My_username My_username 0 May 11 17:45 MyOut|
Я могу запустить программу с перенаправлением на эту ссылку
./Execute_program > MyOutput & cat MyOutput
и вывод начинает идти на терминал.
Если я нажимаю ctrl+c, я прерываю поток, но не запущенный процесс (для этого мне нужно использовать что-то вроде kill pid
или kill %1
).
Когда во второй раз я попрошу FIFOs сделать дамп на терминал (снова с cat MyOutput
), он начнет делать дамп вывода с этого момента.
Примечания и предупреждения:
FIFOs
, он будет держать весь вывод. cat MyOutput >> NewRealFile
cat MyOutput
и из другого терминала! FIFO
, поток будет слит (нет априорного способа отличить, из какой программы пришла эта строка). X-сервер является сервером, поскольку он обслуживает устройства отображения и ввода для приложений.
Такие приложения, как lxterminal
, подключаются к этому X-серверу, чтобы запросить какую-либо услугу. Например:
Они подключаются к X-серверу через домен UNIX или сокет ABSTRACT или TCP.
Точно так же эмулятор терминала можно рассматривать как сервер для терминальных приложений.
С помощью echo test > /dev/pts/12
приложение echo
можно рассматривать как подключение к эмулятору терминала (посредством псевдотерминала -вместо сетевого сокета, хотя здесь соединение выполняется перенаправлением оболочки, а неecho
)и запросом услуги:отобразите тест и переместите курсор вниз .
Теперь некоторые эмуляторы терминала, включая терминал gnome -и lxterminal, имеют эту (раздражающую функцию IMO ), когда при первом вызове они запускают процесс-демон, который обрабатывает будущие запросы на открытие нового окна терминала.
Более поздние вызовы тех, кто подключается к этому серверу (с использованием этого /run/user/1000/.lxterminal-socket-:0
доменного сокета UNIX в вашем случае )для запроса нового окна терминала, предположительно для экономии ресурсов или для обмена некоторой информацией между окнами терминала..
Когда вы делаете:
cd /tmp && lxterminal -e vim
Хотя lxterminal
уже запущен, этот второй вызов просто сообщает серверу lxterminal
запустить vim
в новом окне с текущим каталогом, измененным на /tmp
.
См. xterm
или rxvt
для эмуляторов терминала, которые работают более традиционным способом.
Вы можете сделать то же самое с:
printf '%s\0' /tmp lxterminal -e vim |
socat -u - 'unix-connect:"/run/user/1000/.lxterminal-socket-:0"'
Меня это раздражает, потому что это означает, что только первый вызов наследует среду (environment в глобальном смысле, включая umask
, cwd
, env vars... )вызывающей стороны, только последующие вызовы получить cwd.
Подробнее об этом в прекрасном ответе @JdeBP на lxterminal в выводе netstat