將多個命令粘貼到終端時,Bash 命令會被截斷
我將以下 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 的輸出。