O terminal não aceita linhas coladas ou digitadas com mais de 1024 caracteres [duplicados]

13

Quando eu insiro texto em stdin em um terminal OS X, uma única linha é limitada a 1024 caracteres. Por exemplo, cat > /dev/null apita depois de digitar (ou colar) uma linha maior que essa e se recusa a aceitar mais caracteres. Um exemplo problemático é quando quero contar os caracteres do texto colado com cat | wc -c : os blocos cat na primeira linha longa.

Este parece ser um problema geral ao colar para stdin. Essa limitação observada de 1024 caracteres por linha pode ser removida ou aumentada para um limite superior?

Eu preciso disso porque quero colar texto com linhas com mais de 1024 caracteres.

Eu também poderia usar um "heredoc" << EOT e colar minhas linhas longas sem nenhum problema, mas o texto aparece no meu histórico de shell, o que eu não quero.

    
por Eric Lebigot 21.05.2015 / 15:03

1 resposta

10

Provavelmente um limite do buffer do editor de linha interno da disciplina de linha de dispositivo de terminal.

Você deve ser capaz de inserir linhas longas pressionando Ctrl + D no meio dela (para que a parte atualmente inserida seja enviada para cat e o editor de linha liberado), ou desativando esse editor de linha completamente.

Por exemplo, se estiver usando zsh :

STTY=-icanon cat > file

Note que você não pode usar Backspace ou qualquer outro recurso de edição. Você também precisa pressionar Ctrl-C para parar cat .

Com outros shells:

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

Seguido por:

stty "$s"

Ou apenas:

stty -icanon; cat > file
stty sane

Claro, coisas como

cat | wc -l

ou

wc -l

não funciona. Porque Ctrl + C mata todos os processos no grupo de processos em primeiro plano.

Você poderia fazer:

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

Ou como sugerido por @mikeserv :

STTY='eol " "' wc -l

Dessa forma, o buffer será liberado toda vez que você entrar no espaço. Você ainda está no modo canônico, então você ainda pode editar palavras (em oposição a linhas) e usar Ctrl + D para indicar EOF.

Ou:

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

EOF virá 3 segundos depois de você parar de digitar. Ou:

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

Digite EOF (as 3 letras em uma linha) para finalizar a entrada.

Como sugerido por Gilles , onde possível (como em geral não um telnet / ssh sessão por exemplo), use pbpaste em vez de colar. (Isso é no OSX; no X11, chame xsel ou xclip .):

pbpaste | wc -l

Isso também evitará problemas com alguns caracteres de controle (como ^C ) que podem ser encontrados no buffer de copiar e colar.

    
por 21.05.2015 / 15:13