Command-Line
終端不接受超過 1024 個字元的粘貼或鍵入行
當我在 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)
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 下,呼叫xsel
或xclip
.):pbpaste | wc -l
這也將避免
^C
可能在複製粘貼緩衝區中找到的某些控製字元(如 )出現問題。