web-dev-qa-db-ja.com

Edスクリプトは、ゆっくり入力した場合にのみ機能します

このコンテキストscriptからコマンドを入力または貼り付けているときにed file < script?を出力し、エラー2で終了する状況が発生しました。時間はうまくいきました。シェルプロセスがファイルを一度に1行ずつ通過させ、その間にsleepを入れても正しく機能しました。そのため、MacOS10.12のバージョンであるedのバージョンでは、コマンドが不便なときに表示されると問題が発生するように見えます。

  1. 取得したコマンドを処理する準備ができるまで、edがstdinの読み取りを単純に回避しないのはなぜですか?それとも私は状況を誤解していますか?

  2. エラーメッセージ?はあまり役に立ちません。マニュアルページによると、インタラクティブセッションでは、後でhと入力して、エラーメッセージを表示できます。ただし、TTY以外からの入力では、すぐに終了します。この場合もエラーメッセージを表示する方法はありますか?

  3. これは既知の問題ですか?もしそうなら、コマンドをゆっくり渡す代わりに、提案された回避策はありますか?どのバージョンのedが影響を受けますか?

4
MvG

この問題は、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と入力したかのように、エラーは単純な?ではなく詳細になります。ただし、各行の終わりにキャリッジリターンがある場合、これはedHを有効なコマンドとして認識できなくなるため、役に立ちません。

質問3:OpenBSDでGNU ed(1.14.2)とBSD edを使用しましたが、edコマンドを「速すぎて」フィードすることによって引き起こされるこの問題は見ていません。

2
Kusalananda