Bashシェルがコピーして貼り付けた重複テキストを「無視」できますか?

Bashシェルがコピーして貼り付けた重複テキストを「無視」できますか?

GUIテキストエディタに「Quick&Dirty」Perlスクリプトがあり、Bashを実行しているターミナルウィンドウでPerlインタプリタを起動するとします。 Perlスクリプトをコピーして端末に貼り付け、CTRL-Dを押してPerlを使用して実行できます。 Perlはスクリプトを解釈して実行します。

時にはスクリプトに誤字があり、Perlは致命的なエラーを印刷して終了しますが、コピーして貼り付けた残りのテキストは、実行しようとしているBashシェルに渡され、失敗するか(運の場合)実行されますが、他の操作を実行します。 (不幸な状況)。

例: Bash プロンプトで Perl を起動し、スクリプトの 5 行をコピーして貼り付けます。 1行と2行は問題ありませんが、3行でPerlが異常終了するため、4行と5行はBashによって実行されます。

私は単にPerlとBashを例として使用しました。他の多くの対話型ツール(Python、fdiskなど)や他のシェル(zsh、cshなど)では問題が発生する可能性があります。

テキストがコピー&ペースト入力なので、無視できることをシェルに知らせる方法はありますか?
「ユーザーが一般的に入力できるよりも早ければ無視」のようなものはありますか?
それとも、「プロセスが完了したら、次のシェル入力を読み取る前に入力バッファをフラッシュします」のようなものですか?

[[一部のツールにはこの問題はありません。たとえば、MySQL cliは誤った入力のため終了しません。 ]]

答え1

これは答えではありませんが、おそらく許容される解決策かもしれません。

alias p='perl; echo hit control-d again; cat > /dev/null'

その後、Perlスクリプトが早期に終了すると、残りの内容は/ dev / nullに安全に貼り付けられます。 Perlスクリプトが成功すると、おなじみの通知が表示され、Ctrl-dを押してキャッチャーを終了しますcat

答え2

Jeff Schallerの「ソリューション/解決方法」に加えて、正しい解決策は、「ブラケット - 貼り付けモード」という発信者と受信者の両方のコピー - 貼り付けを環境で認識するようにするようです。
~からhttps://cirw.in/blog/bracketed-paste、詳細を説明する短いスニペットは次のとおりです。

簡単に言うと:

  1. 角かっこ貼り付けを有効にする: printf "\e[?2004h"
  2. 貼り付けが始まるまでお待ちください。 STDINに\ e [200〜が表示されます。
  3. 貼り付けが停止されるまで待ちます。 STDINに\ e [201〜が表示されます。
  4. 角かっこ貼り付けを無効にする: printf "\e[?2004l"

まだBashでは完全に利用できないので、Jeff Schallerの答えを受け入れます。これは私にとって効果的でした。

答え3

端末に貼り付けるのではなく、クリップボードからコマンドを読んでください。あなたはそれを使用することができますクリップまたはシェルクリップボードの内容を印刷します(または逆に入力内容をクリップボードに書き込みます)。

xsel | perl           # automatic selection (click+drag, middle click)
xsel -b | perl        # manual selection (Ctrl+C, Ctrl+V)

これは、ターミナルのシェルがXサーバーにアクセスできる場合にのみ機能します。たとえば、X11接続を転送しないSSHセッションでは機能しません。

OSXでは、以下を使用してください。pbpaste一時ボードの内容を検索します。

関連情報