Shell

將多個命令粘貼到終端時,Bash 命令會被截斷

  • June 25, 2018

我將以下 100 行複制/粘貼到我的終端(xterm)中,以在我連接到的伺服器上執行那些ssh

mv /long/path/to/file1 /longer/path/to/file1
mv /long/path/to/file2 /longer/path/to/file2
...
mv /long/path/to/file99 /longer/path/to/file99
mv /long/path/to/file100 /longer/path/to/file100

不幸的是,在複製/粘貼之後,我在下面找不到我的 100 個文件/longer/path/to/

查看我通過 ssh 連接到的伺服器上的 bash 歷史記錄,我可以看到在前 20 個命令之後,大多數命令都被截斷了:

mv /long/path/to/file1 /longer/path/to/file1
...
mv /long/path/to/file20 /longer/path/to/file20
mv /long/path/to/fi
mv /long/path/to/fi
mv /long/path/to/file23 /longer/p
mv /long/path/to/file24 /longer/path
mv /long/path/to/file25 /longer/p
mv /long/path/to/file26 /longer/p
mv /long/path/to/file27 /longer/path/t
mv /long/path/to/file28 /longer/path/to/fil
mv /long/path/to/file29 /longer/path/to/fil
mv /long/path/to/file30 /longer/path/to/file
mv /long/path/to/file31 /longer/path/to/file
...

我可以找到有關如何解決此問題的答案:

但我找不到關於到底發生了什麼的解釋。尤其:

  • 這是與終端相關的問題(在我的情況下為 Xterm)?
  • 複製/粘貼發生在ssh:這是否會產生或放大問題?
  • 這是伺服器上與 bash 相關的問題嗎?另一個外殼可能不會發生嗎?

似乎你遇到了這個錯誤:

https://lkml.org/lkml/2013/7/25/205

當大於 4k 的粘貼超出行規則緩衝區時,readline() 會無意中觸發錯誤恢復路徑。當行規則緩衝區已滿並在規範模式下執行且未接收到換行時,錯誤恢復路徑會丟棄輸入。因為 readline() 將 termios 更改為非規範模式以逐個字元地讀取行,所以行規則緩衝區可能會變滿,然後當 readline() 將 termios 恢復為呼叫者的規範模式時,現在已滿行規則緩衝區觸發錯誤恢復。

當將 termios 從非佳能模式更改為佳能模式並且讀取緩衝區包含數據時,請在讀取緩衝區中模擬沒有DISABLED_CHAR 的 EOF 推送。

重要的是對於 readline() 問題,termios 可以更改回非規範模式,而不會更改讀取緩衝區;即,好像之前的 termios 更改沒有發生(只要沒有發生干預讀取)。

它於 2013 年 12 月 10 日應用於核心,即 linux 核心 3.14。你使用的是比這更老的 Linux 發行版嗎?你的發行版是什麼?您可能替換了文件的真實路徑,所以我無法計算字元數。你能做到嗎:

for ((a=1; a<20; a++)); do echo "mv /long/path/to/file$a /longer/path/to/file$a"; done|wc -c

用你的真實路徑 - 它會真的接近 4k 嗎?如果是這樣,上面的錯誤可能是你的。

如果是,請回答您的問題:

  • 這是與終端相關的問題(在我的情況下為 Xterm)?

  • 複製/粘貼發生在 ssh 上:這會產生或放大問題嗎?

  • 這是伺服器上與 bash 相關的問題嗎?

不,是 - 這不是 bash 或 bash 使用的任何庫中的錯誤。錯誤在核心中。

  • 另一個外殼可能不會發生嗎?

可能是,如果 shell 沒有使用 readline。像zsh。

關於相關問題“如何粘貼多個…”似乎與您的問題無關 - 原因是某些應用程序可能會讀取您粘貼的命令。最著名的例子是 ssh,如果你在遠端伺服器上執行 ssh 命令。但是鑑於您只失去了部分線路,您的情況不太可能。

第二個問題“粘貼到終端的命令…”於 2013 年 9 月 25 日問,當時更新檔不存在,這絕對看起來像你有的錯誤,我懷疑我是核心的錯誤。

如何確定?在此處粘貼 uname -a 的輸出。

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