Read
外殼讀取錯誤處理輸入按鍵
我正在安裝一個相對較新的 Linux Mint,直到現在我還沒有註意到任何重大問題,我意識到我無法使用任何互動式讀取使用者輸入的命令行工具。它沒有像我期望的那樣通過使用一行輸入來處理輸入鍵,而是將
^M
字元序列列印到終端並繼續提示輸入。例如
git add -p
:Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? y^M
經過更多測試後,我意識到所有 shell
read
操作都在執行此操作(在zsh
和中bash
),並且sh
完全無法使用。zsh 和 bash:
$ read test value^M^C $
噓:
$ echo "test"^M^C $ exit^M^M^M^C $
我打開了一個新終端,它似乎沒有受到影響,所以我沒有被困在這裡,但我很想知道發生了什麼讓這個終端表現得像現在這樣。我會把壞掉的打開一段時間,以測試人們是否有理論。
這通常發生在將終端設置為原始輸入模式的程序意外死亡並且無法將終端設置恢復為其先前值時。
一個簡單的
stty sane
應該將一切重置為正常。作為使終端“原始”的一部分,通過關閉termios設置中的標誌來禁用輸入 (
^M
,\r
) 到換行 (^J
, ) 的轉換。這也可以從命令行使用.\n``ICRNL``c_iflag
stty -icrnl
像 bash 這樣的 shell 的命令行通常不受此影響,因為 bash 使自己成為終端原始並進行自己的鍵轉換(為了提供良好的行編輯功能,例如左右移動插入點,命令行歷史等),並且僅在執行其他命令時恢復預設終端設置。