対話型のコマンド ライン プログラムを呼び出して、キーボードから直接入力する方法と、名前付きパイプから入力する方法を見つけようとしています。私の目標は、これを 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
これは、バックスペースまたは矢印キーを使用しようとすると正しく機能しないことを除いて、私が探しているものとほぼ同じです。(これは、通常 bash の readline ライブラリによって処理されるキーストロークをインターセプトしているためだと思いcat
ますか?) 他の提案はありますか?
最終的には、MATLAB プロセスを起動して、TextMate からコマンドを送信できるだけでなく、ターミナルで操作できるようにしたいと考えています。私は仕事で MATLAB を使用していますが、その GUI やエディターはあまり好きではありません。
2010 年 12 月 19 日編集
すべての非常に役立つ提案をありがとう!興味のある方のために、この結果を要約したいと思います。を調べましrlwrap
たが、私の目標は誰でも使用できる TextMate バンドル内でこれを機能させることだったので、非標準のユーティリティ (最初に言及する必要があった) に依存することをためらっていました。私も簡単にチェックしましexpect
たunbuffer
が、まあ、かなり複雑に思えて、そこに飛び込む勇気がありませんでした.
screen
これは非常にうまく機能しました-以下に示すように、ターミナルを開いて start screen
、 startを実行すると、TextMate コマンドmatlab -nodesktop
を使用して、選択したテキストを Matlab に送信することができました。screen -X ...
私が気づいたこのアプローチの欠点は次のとおりです。
- 1,024 文字を超えるテキスト ブロックを送信すると、`screen` からエラーが発生しました。それ以上は保持できないバッファーがどこかにあると思いますが、それを追跡するのに時間をかけませんでした。
- 画面には独自のスクロールバック バッファがあるため、ターミナルのスクロールバーはほとんど役に立たなくなります。たぶん、これがどのように機能するかを変更するオプションがありますか?
- Control-A は `screen` のコマンド キーストロークです。コマンドキーを再バインドしない限り、行頭への移動には使用できません。
をいじってい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 を実行している [ターミナル] タブを検索することもできますが、わかりやすくするために除外しました。)
この話の教訓は、もっと具体的な質問をするべきだということです。ご協力ありがとうございました。私はこれと格闘することから多くのことを学びました!