Shell

Bash shell 可以“忽略”多餘的複制粘貼文本嗎?

  • February 8, 2016

假設我在 gui 文本編輯器中有一個“Quick&Dirty”Perl 腳本,我在執行 Bash 的終端視窗中啟動 Perl 解釋器。我可以將 Perl 腳本複制粘貼到終端並按 CTRL-D 以使用 Perl 執行它。Perl 將解釋腳本並執行它。

有時,腳本中有一個拼寫錯誤,這使得 Perl 列印一個 FATAL ERROR 並退出,但剩餘的複制粘貼文本被提供給 Bash shell,它試圖執行它;要麼失敗(幸運的情況),要麼執行但會做一些不同的事情(不幸的情況)。

例如:在 Bash Prompt 中啟動 Perl,複製粘貼 5 行腳本:第 1 行和第 2 行很好,但是第 3 行使 Perl 異常退出,因此第 4 行和第 5 行由 Bash 執行。

例如,我僅使用 Perl 和 Bash;許多其他互動式工具(例如 Python、fdisk)和其他 shell(例如 zsh、csh)可能會出現問題

有什麼方法可以通知 shell 這個文本是複制粘貼輸入並且可以忽略?

諸如“如果比使用者通常可以輸入的速度快,則忽略”之類的東西?

或者類似“如果程序完成,則在讀取下一個 shell 輸入之前刷新輸入緩衝區”?

$$ [ Some tools do not have this problem, Eg MySQL cli will never exit on improper input. $$]

這不是一個答案,但也許這是一個可以接受的解決方法:

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

然後,如果您的 perl 腳本過早退出,您將無害地將剩餘部分粘貼到 /dev/null; 如果 perl 腳本成功,您將看到友好的提醒並按 control-d 退出cat捕手。

除了 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 的回答,這對我來說很好用。

引用自:https://unix.stackexchange.com/questions/260395