
私は SML プログラムを作成していますが、実際に REPL を実行せずに REPL でプログラムを実行した結果の出力をすばやく確認する方法が必要です (プログラムに構文エラーがあるかどうかをすばやく確認するため - これを vim 内の .sml ファイルの make プログラムとして使用し、vim 内で出力を表示する予定です)。現在、私はこれを持っています:
sml file.sml | echo -e "\004"
そこでプログラムを実行し、Ctrl-D をエコーして REPL を終了します。問題は、Ctrl-D キーを送信するのが速すぎるため、出力がないことです。これも試しました:
sml file.sml | sleep 2 ; echo -e "\004"
しかし、それでもうまくいきません。REPL から出力のダンプを取得する方法について何かアイデアはありますか?
答え1
いいえ、問題はパイプの仕組みを誤解していることです。
Unixパイプラインでは、データフローは左から右へ(英語のテキストと同じ方向) – 最初のプログラムの出力は 2 番目のプログラムの入力になります。ただし、パイプは単方向であるため、2 番目のプログラムの出力は最初のプログラムに送信されません。
走るとsml file.sml | echo -e "\004"
、ないCtrl+Dを にエコーしますsml
。代わりに、sml
の出力をecho
コマンドにパイプするecho
– stdin を使用しないため、破棄されます。
- キーボード →
sml file.sml
→echo -e "\004"
→ 画面
2 つ目の試みでsml file.sml | sleep 2 ; echo -e "\004"
ある にも同様の問題が発生します。 の出力sml
が に送信されますsleep
(これも受信した入力を破棄します)。ただし、別の問題があります。コマンドはecho
パイプラインの一部ではなくなったため、 は|
よりも優先順位が高いと言えます;
。(括弧を使用してコマンドをグループ化する; 例a | (b; c; d)
.)
- キーボード →
sml file.sml
→sleep 2
→ 画面 - キーボード →
echo -e "\004"
→ 画面
すでに述べたように、両方の試みは間違った方向\004
文字を に送信したい場合sml
、パイプラインは次のように記述する必要があります。
echo -e "\004" | sml file.sml
ここで、sml
の出力は画面に表示されます。
がある別の問題しかし、あなたはまたCtrlDキーの押下と「入力終了」を混同するイベント。
を「入力終了」に変換するのはCtrlD、端末デバイス層でのみ行われます。つまり、端末ウィンドウにCtrl+D文字を入力したときのみです。ただし、echo -e "\004"
パイプで使用する場合は、ない自動的に「入力の終わり」に変換されます。代わりに、実際のバイト 004 [8 進数] が書き込まれます。
実際にプログラムに入力がなくなったことを伝えたい場合は、何も書かない何も出力しないコマンド( または など)を使用するecho -n
かtrue
、ファイルからの入力をリダイレクトするだけです/dev/null
。
echo -n | sml file.sml
sml file.sml < /dev/null