Я пытаюсь найти способ вызвать интерактивную программу командной строки, чтобы она принимала ввод как непосредственно с клавиатуры, так и из именованного канала. Моя цель - заставить это работать с MATLAB, но я думаю, что Bash работает так же, как пример. Поэтому идея состоит в том, чтобы запустить Bash, и после его запуска я могу набирать команды, использовать стрелку вверх для истории и т. Д., А также отправлять команды в именованный канал. Я несколько дней оглядывался по сторонам и возился с этим, но пока ничего из того, что я пробовал, не сработало.
Например, на https://serverfault.com/questions/171095/how-do-i-join-two-named-pipes-into-single-input-stream-in-linux есть полезная ветка, которая предлагает сделать что-то вроде этого:
mkfifo alt_in
(tail -f alt_in & cat) | bash
Это почти то, что я ищу, за исключением того, что, если вы попытаетесь использовать клавиши Backspace или клавиши со стрелками, это не будет работать правильно. (Я полагаю, это потому, что cat
перехватывает нажатия клавиш, которые обычно обрабатываются библиотекой readline в bash?) У кого-нибудь есть другие предложения?
В конечном итоге я хотел бы иметь способ запустить процесс MATLAB, чтобы я мог отправлять ему команды из TextMate, но также взаимодействовать с ним в терминале. Я использую MATLAB для работы, но я не большой поклонник его GUI или редактора.
Изменить 19 декабря 2010 г.
Спасибо за все очень полезные предложения! Я хотел бы подвести итог этого для всех, кто заинтересован. Я посмотрел на rlwrap
, но так как моя цель состояла в том, чтобы заставить это работать внутри пакета TextMate, который любой мог использовать, я не решался положиться на нестандартную утилиту (которую я должен был упомянуть в первую очередь). Я также кратко проверил expect
и unbuffer
, но они кажутся довольно сложными, и у меня просто не хватило смелости погрузиться в это.
screen
работал довольно хорошо для этого - как предложено ниже, я мог бы открыть Терминал, запустить screen
, запустить matlab -nodesktop
, и затем было возможно, чтобы TextMate, например, отправлял выбранный текст в Matlab, используя screen -X ...
внутри команды TextMate. Недостатки этого подхода, которые я заметил, были:
- Отправка блока текста, содержащего более 1024 символов, привела к ошибке из `screen`; Я полагаю, что где-то есть какой-то буфер, который не может вместить больше этого, но не тратит время на его поиск.
- Экран имеет собственный буфер прокрутки, что делает полосу прокрутки в терминале довольно бесполезной. Может быть, есть возможность изменить, как это работает?
- Control-A - это комбинация клавиш `экрана`; Вы не можете использовать его для перехода к началу строки, если не перепутали командную клавишу.
Пока я играл с screen
, мне пришло в голову, что, хотя вопрос, который я задал, касается соединения каналов, STDIN и т. Д., Я на самом деле забочусь об этом только для очень конкретного случая: получения текста из TextMate для Терминал. И это побудило меня попробовать сделать это с AppleScript, и удивительно, что оказалось проще и надежнее, чем любая другая вещь, которую я пробовал. Создайте команду TextMate, которая принимает выбранный текст или текущую строку в качестве ввода и содержит
#!/usr/bin/env osascript
set input_command to do shell script "cat"
tell application "Terminal"
do script input_command in window 1
end tell
И это прекрасно работает, пока MATLAB находится в самом переднем окне терминала. (Также возможно выполнить поиск вкладки «Терминал», на которой выполняется MATLAB, я просто исключил это для ясности.)
Мораль этой истории в том, что я должен задавать более конкретные вопросы. Еще раз спасибо всем за помощь; Я многому научился в борьбе с этим!