OS Xターミナルでstdinにテキストを入力すると、1行が1024文字に制限されます。たとえば、cat > /dev/null
は、これより長い行を入力(または貼り付け)した後にビープ音を鳴らし、それ以上の文字の受け入れを拒否します。問題のある例は、貼り付けたテキストの文字をcat | wc -c
でカウントしたい場合です。最初の長い行のcat
ブロックです。
これは、標準入力への貼り付けに関する一般的な問題のようです。この1行あたりの1024文字のstdin制限は削除されるか、より高い制限にプッシュされますか?
1024文字より長い行を含むテキストを貼り付けたいので、これが必要です。
「ヒアドキュメント」<< EOT
を使用して問題なく長い行を貼り付けることもできますが、テキストがシェルの履歴に表示されますが、これは望ましくありません。
おそらく、端末デバイスの回線制御の内部回線エディタバッファの制限です。
を押すと長い行を入力できるはずです 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
など)の問題も回避されます。