O shell Bash “Ignore” Excesso de copiar e colar texto?

3

Digamos que eu tenha um script Perl "Quick & Dirty" em um editor de texto gui e inicio o interpretador Perl em uma janela de terminal que está executando o Bash. Eu posso copiar e colar o script Perl no terminal & pressione CTRL-D para executá-lo com Perl. Perl irá interpretar o script e executá-lo.

Às vezes, há um erro de digitação no script, o que faz com que Perl imprima um ERRO FATAL e saia, mas o texto restante de copiar e colar é dado ao shell Bash que tenta executá-lo; Ou isso falha (caso de sorte) ou executa mas vai fazer algo diferente (caso de azar).

Exemplo: inicie o Perl no Bash Prompt, copie e cole um script de 5 linhas: linhas 1 & 2 estão bem, mas a linha 3 faz Perl sair anormalmente, portanto, a linha 4 & 5 são executados pelo Bash.

Estou usando o Perl & Bash apenas por exemplo; O problema pode acontecer com muitas outras ferramentas interativas (por exemplo, Python, fdisk) e outras shells (por exemplo, zsh, csh)

Existe alguma maneira de informar o shell que este texto é uma entrada de copiar e colar e pode ser ignorado?
Algo como "se mais rápido do que o usuário normalmente pode digitar, então ignorar"?
Ou algo como "Se o processo foi concluído, esvazie o buffer de entrada antes de ler a próxima entrada do shell"?

[[Algumas ferramentas não possuem este problema, por exemplo, o MySQL cli nunca sairá com uma entrada incorreta. ]]

    
por Prem 06.02.2016 / 19:18

3 respostas

3

Isso não é uma resposta, mas talvez seja uma alternativa aceitável:

alias p='perl; echo hit control-d again; cat > /dev/null'

Então, se o seu script perl sair prematuramente, você irá colar o restante em / dev / null; se o script perl for bem-sucedido, você verá seu lembrete amigável e pressionará control-d para sair do cat catcher.

    
por 06.02.2016 / 19:24
1

Além da "solution / work-around" de Jeff Schaller, a solução adequada parece ser tornar o ambiente ciente do copy-paste, tanto do lado do remetente quanto do lado do receptor, que é conhecido como "pasta entre colchetes". mode ".
De link , aqui está um pequeno trecho para explicar um pouco mais:

In summary:

  1. Enable bracketed paste: printf "\e[?2004h"
  2. Wait for paste to start: you'll see \e[200~ on STDIN.
  3. Wait for paste to stop: you'll see \e[201~ on STDIN.
  4. Disable bracketed paste: printf "\e[?2004l"

Ainda não está totalmente disponível para o Bash, por isso vou aceitar a resposta de Jeff Schaller, que funciona bem para mim.

    
por 07.02.2016 / 08:47
1

Em vez de colar no terminal, faça o comando ler na área de transferência. Você pode usar xclip ou xsel para imprimir o conteúdo da área de transferência (ou, por outro lado, gravar sua entrada na área de transferência).

xsel | perl           # automatic selection (click+drag, middle click)
xsel -b | perl        # manual selection (Ctrl+C, Ctrl+V)

Isso só funciona se o shell no terminal tiver acesso ao servidor X. Não funciona, por exemplo, em uma sessão SSH que não encaminhe a conexão X11.

No OSX, use pbpaste para recuperar o conteúdo da área de transferência.

    
por 08.02.2016 / 02:00