Command-Line

終端不接受超過 1024 個字元的粘貼或鍵入行

  • May 23, 2015

當我在 OS X 終端中的標準輸入上輸入文本時,單行限制為 1024 個字元。例如,cat > /dev/null在我鍵入(或粘貼)比這更長的行後發出嗶嗶聲,並且拒絕接受更多字元。一個有問題的例子是,當我想用cat | wc -c:計算粘貼文本中的字元cat時,第一行的塊。

這似乎是粘貼到標準輸入的普遍問題。這種觀察到的每行 1024 個字元的標準輸入限制可以刪除或推到更高的限制嗎?

我需要這個,因為我想粘貼行長超過 1024 個字元的文本。

我也可以使用“heredoc”<< EOT並毫無問題地粘貼我的長行,但隨後文本出現在我的 shell 歷史記錄中,這是我不想要的。

可能是終端設備行規則內部行編輯器緩衝區的限制。

您應該能夠通過Ctrl+D在它的中間按下來輸入長行(因此目前輸入的部分被發送到cat並刷新行編輯器),或者完全禁用該行編輯器。

例如,如果使用zsh

STTY=-icanon cat > file

請注意,您不能使用Backspace或任何其他編輯功能。您還需要按Ctrl-C停止 cat

與其他外殼:

s=$(stty -g); stty -icanon; cat > file

其次是:

stty "$s"

要不就:

stty -icanon; cat > file
stty sane

當然,諸如

cat | wc -l

或者

wc -l

不會工作。因為Ctrl+C殺死了前台程序組中的所有程序。

你可以這樣做:

STTY=-icanon cat | (trap '' INT; wc -l)

或者按照@mikeserv 的建議

STTY='eol " "' wc -l

這樣,每次進入空間時都會刷新緩衝區。您仍處於規範模式,因此您仍然可以編輯單詞(而不是行)並使用Ctrl+D來表示 EOF。

或者:

STTY='-icanon min 0 time 30' wc -l

EOF 將在您停止輸入 3 秒後出現。或者:

STTY=-icanon sed -n '/^EOF$/q;p' | wc -l

並輸入EOF(單獨一行的 3 個字母)結束輸入。

正如Gilles 所建議的那樣,在可能的情況下(例如通常不是telnet/ssh 會話),使用pbpaste而不是粘貼。(在 OSX 上;在 X11 下,呼叫xselxclip.):

pbpaste | wc -l

這也將避免^C可能在複製粘貼緩衝區中找到的某些控製字元(如 )出現問題。

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