このコンテキストscript
からコマンドを入力または貼り付けているときにed file < script
が?
を出力し、エラー2で終了する状況が発生しました。時間はうまくいきました。シェルプロセスがファイルを一度に1行ずつ通過させ、その間にsleep
を入れても正しく機能しました。そのため、MacOS10.12のバージョンであるed
のバージョンでは、コマンドが不便なときに表示されると問題が発生するように見えます。
取得したコマンドを処理する準備ができるまで、edがstdinの読み取りを単純に回避しないのはなぜですか?それとも私は状況を誤解していますか?
エラーメッセージ?
はあまり役に立ちません。マニュアルページによると、インタラクティブセッションでは、後でh
と入力して、エラーメッセージを表示できます。ただし、TTY以外からの入力では、すぐに終了します。この場合もエラーメッセージを表示する方法はありますか?
これは既知の問題ですか?もしそうなら、コマンドをゆっくり渡す代わりに、提案された回避策はありますか?どのバージョンのedが影響を受けますか?
この問題は、ed
スクリプトのキャリッジリターンが原因である可能性があります。テキストをコピーして貼り付けると、実行中のed
プロセスに転送されませんが、スクリプトファイルにある場合は、ed
が混乱していることがわかります。
GNU ed
は、「破損または無効な入力ファイルを示すために」終了ステータス2で終了します。これは、DOS形式のスクリプトファイルである可能性があるという推測をサポートします。ただし、macOSのデフォルトのed
はBSD ed
であり、終了コードはマニュアルに適切に記載されていません。 (OpenBSD)ソースを見ると、この終了コードを引き起こすほとんどのエラーは、スクリプトファイルの読み取りに関係しているように見えます。
各改行の前に\r
を削除するには(インプレース編集を実行します):
printf '%s\n' ',s/\r$//' 'wq' | ed -s file
キャリッジリターンは、たとえばWindowsエディター、またはファイルをDOS形式のテキストファイルとして保存したエディターでスクリプトを記述したことで得られます。
質問1:そうなると確信しています。
質問2は、ed
が生成するかなり簡潔な診断メッセージ(ほとんどの場合、?
)と関係があります。 H
関数を呼び出して編集スクリプトを開始すると、エラーの後にh
と入力したかのように、エラーは単純な?
ではなく詳細になります。ただし、各行の終わりにキャリッジリターンがある場合、これはed
がH
を有効なコマンドとして認識できなくなるため、役に立ちません。
質問3:OpenBSDでGNU ed
(1.14.2)とBSD ed
を使用しましたが、ed
コマンドを「速すぎて」フィードすることによって引き起こされるこの問題は見ていません。