web-dev-qa-db-ja.com

端末は、1024文字を超える貼り付けまたは入力された行を受け入れません

OS Xターミナルでstdinにテキストを入力すると、1行が1024文字に制限されます。たとえば、cat > /dev/nullは、これより長い行を入力(または貼り付け)した後にビープ音を鳴らし、それ以上の文字の受け入れを拒否します。問題のある例は、貼り付けたテキストの文字をcat | wc -cでカウントしたい場合です。最初の長い行のcatブロックです。

これは、標準入力への貼り付けに関する一般的な問題のようです。この1行あたりの1024文字のstdin制限は削除されるか、より高い制限にプッシュされますか?

1024文字より長い行を含むテキストを貼り付けたいので、これが必要です。

「ヒアドキュメント」<< EOTを使用して問題なく長い行を貼り付けることもできますが、テキストがシェルの履歴に表示されますが、これは望ましくありません。

17
Eric O Lebigot

おそらく、端末デバイスの回線制御の内部回線エディタバッファの制限です。

を押すと長い行を入力できるはずです Ctrl+D その途中(現在入力されている部分がcatに送信され、ラインエディターがフラッシュされる)、またはそのラインエディターを完全に無効にすることによって。

たとえば、zshを使用している場合:

STTY=-icanon cat > file

使用できないことに注意してください Backspace またはその他の編集機能。あなたも押す必要があります Ctrl-Ccatを停止します。

他のシェルの場合:

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

これにより、スペースに入るたびにバッファがフラッシュされます。まだ正規モードであるため、wordsを(行ではなく)編集して使用できます。 Ctrl+D EOFを示します。

または:

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

入力を停止してから3秒後にEOFが表示されます。または:

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

入力を終了するには、EOF(1行に3文字だけ)を入力します。

Gillesが推奨 のように、可能な場合は(一般にnottelnet/sshセッションなど)、pbpasteの代わりに貼り付けます。 (これはOSXの場合です。X11では、xselまたはxclipを呼び出します。):

pbpaste | wc -l

これにより、コピー/貼り付けバッファーにある一部の制御文字(^Cなど)の問題も回避されます。

12