Como cat 'EOF' dados de texto arbitrários da área de transferência

3

Eu quero colar algum texto em um terminal e salvá-lo em um arquivo sem usar um editor, mas apenas 'cat'.
Mas linhas muito longas ou tabulações no texto tornam impossível fazê-lo com um simples comando como "cat > test.txt" ou "cat < < 'EOF' > test.txt" ("aqui documento").

No bash no modo "aqui documento", se os dados de texto colado contiverem guias, eles causarão o preenchimento automático.
Se eu começar o bash com '--noediting', em alguns sistemas o comprimento da linha colada é limitado a 256 caracteres, o restante do texto colado é descartado. Se, em vez disso, eu colar diretamente na entrada do gato (sem < < 'EOF'), a linha máxima também é 256.

Se eu fizer:

stty raw; cat >test.txt; stty sane

, o tamanho da linha não é mais limitado, mas não há como enviar o EOF para a entrada do gato.
Se eu ativar o eof char:

stty raw icanon eof '^d'; cat >test.txt; stty sane

linhas longas são perdidas.

Além disso, se eu não desativar o eco com:

stty -echo

, a combinação do Solaris 10 e do Putty faz com que grandes blocos de texto sejam perdidos, às vezes resultando em um arquivo vazio.

O mais perto que cheguei do que quero é matar o gato com o tempo limite:

( sleep 15; pkill cat ) & stty raw -echo; cat >test.txt; stty sane; echo done

ou para usar bash --noediting com raw:

bash --noediting
stty raw -echo icrnl
cat <<'EOF' >test.txt; stty sane
    
por basin 28.08.2013 / 08:33

1 resposta

1

Se você estiver usando o bash, você pode desabilitar a conclusão da tabulação antes de colar e reativá-la depois usando o comando bind :

bind '\C-i:self-insert'
# paste away
bind '\C-i:complete'

Isso é difícil, mas funciona.

Ao digitar manualmente na linha de comando do bash, você pode inserir uma guia literal pressionando primeiro CTRL-V e depois a guia. Obviamente, você não pode fazer isso quando colando e eu estava chateado o suficiente por isso que eu remendado meu programa de terminal favorito iTerm2 com um "Colar Especial" comando que envia guias literais por meio de uma sequência de guias CTRL-V.

Eu só hoje escrevi e enviei este patch, então se você quer uma versão do iTerm2 que faz isso você terá que compilar seu próprio de meu fork no GitHub usando o Xcode. Espero que ele seja mesclado no aplicativo principal. Se isso acontecer, atualizarei essa resposta. EDIT: As alterações que fiz estão agora no ramo principal do iTerm2. Use o botão Editar - > Colar com o comando Tabulações Literal.

Se você estiver usando um sistema operacional ou terminal diferente, desculpe, não posso ajudar com isso.

    
por 20.03.2014 / 07:06