Desativar o comportamento padrão de copiar e colar no Bash

9

Quando colo na minha sessão do terminal, o shell executa imediatamente o comando sem eu pressionar a tecla Enter.

Realmente não sei como desativar esse comportamento.

Estou usando o terminal pré-instalado no MacOS Yosemite.

Opaldes
fonte
9
Isso é feito apenas, é claro, se o buffer de colagem contiver uma nova linha. Isso não tem quase nada a ver com o bash. (Trata-se de festa apenas se e na medida em que usa a biblioteca readline.)
Peter - Reintegrar Monica
... e ainda bash(com a ajuda de readline) tem uma correção.
Alexis

Respostas:

16

Com o bash4.4 ou mais recente e em terminais que suportam colar à la colchete xterm, você pode:

bind 'set enable-bracketed-paste'

(ou adicione set enable-bracketed-pasteao seu ~/.inputrc)

Isso fará com que o copiar e colar o buffer para ser inserido no prompt em vez dos personagens que ele seja interpretado como se digitado (você ainda pode ter problemas se esse buffer contém caracteres como ^C, ^Ze seu emulador de terminal não filtrá-los) .

zsh faz isso por padrão desde a versão 5.1.

Para outros invólucros ou terminais, consulte também: Como posso me proteger desse tipo de abuso na área de transferência?

Stéphane Chazelas
fonte
Vou olhar para a direita nele
Opaldes
maneiras cabine não parece trabalho
Opaldes
@Opaldes, o que você tentou? Com qual versão de qual shell e em quais terminais? Eu acredito que o OS / X também é fornecido com xterm, você pode tentar isso. Você já tentou o perlscript na pergunta vinculada?
Stéphane Chazelas 14/09/16
1
@Opaldes, de acordo com Colando código na janela do terminal no vim no Mac OS X O OS / X Terminal suporta pasta entre colchetes desde o OS / X Lion. Parece que tudo o que você precisa é de uma versão recente do zsh ou do bash. Nas versões mais antigas do zsh, isso também pode ser alcançado via configuração.
Stéphane Chazelas 14/09/16
1
Podemos agradecer a Daniel Colascione para adicionar esse recurso útil para Bash / Readline: gnu-bash.2382.n7.nabble.com/...
Anthony Geoghegan
6

Isso acontece quando você cola um caractere "nova linha". Por exemplo, se você está colando várias linhas ou copia um retorno de carro de forma desconhecida no final da linha. AFAIK não há como realmente desabilitar esse comportamento, mas existem maneiras de atenuá-lo.

A maneira mais fácil é copiar uma linha de cada vez e perder o último caractere, adicionando-o manualmente posteriormente.

Ou, como the_velour_fog aponta abaixo, você também pode colá-lo em um editor que mostre caracteres não impressos e selecione novamente sem a nova linha.

Há uma ou duas soluções alternativas disponíveis para as distribuições GNU / Linux, mas não faço ideia se o conceito pode ser portado para o MacOS. Independentemente disso, dê uma olhada aqui e veja se há um arquivo semelhante no mac que você possa alterar. Infelizmente, duvido.

I_GNU_it_all_along
fonte
Eu apenas colá-lo para um editor que mostra não impressos caracteres, sem seguida, seleccionar a nova linha
the_velour_fog
Boa sugestão, editada para incluir.
I_GNU_it_all_along
É bom saber que isso explica que isso não acontece o tempo todo. Votou sua resposta, mas é mais uma solução alternativa para mim.
Opaldes 14/09/16
É uma dor, mas pode ser útil ao copiar uma série de comandos.
I_GNU_it_all_along
Minha "solução" também é uma espécie de solução alternativa de invasão, mas é mais rápida do que selecionar separadamente o IMO.
Peter Cordes
5

Antes de colar, digite uma aspas simples e cole. control-ce seta para cima para editá-lo como uma linha gigante.

aspas duplas também funcionam, caso o texto contenha aspas simples, mas não duplas. Tudo bem se ele contém $ou outras coisas que se expandem entre aspas duplas, porque você não está realmente executando a linha gigante citada como um comando.


Na verdade, não é possível editar a coisa toda, porque as novas linhas iniciam um prompt de continuação (não a terminologia oficial) em vez de criar uma grande linha longa.

dadas estas 4 linhas:

echo
ls
foo
bar

colar como eu sugiro resultará nisso na sua tela:

$ 'echo 
> ls
> foo
> bar        <or cursor here if you didn't include a trailing newline
> [cursor here]

Você pode pressionar C-C e Seta para cima. (control-C destrói tudo na mesma linha que o cursor, então pressione return primeiro se houver texto útil lá.)

Uma alternativa é fechar a cotação e pressionar retornar e, em seguida, seta para cima.

De qualquer forma, depois da seta para cima

$ 'echo
ls
foo
bar

controle-a e remova a guia '. Use control-left e control-right para mover-se rapidamente pelo bloco de colar (por palavras). Ou se a configuração do seu terminal não suportar teclas de seta de controle, alt-be alt-f.


As novas linhas literais realmente separam os comandos e essas 4 linhas entram no seu histórico de comandos separadamente . Você pode alterá-los para ;ou &&. (Não conheço um truque para isso, basta usar a repetição de tecla para avançar ou retroceder a palavra para chegar lá rapidamente e fazê-lo manualmente.)

Peter Cordes
fonte
2

Isso acontece porque sua pasta termina com uma nova linha e os emuladores de terminal basicamente alimentam a pasta para basear caracter por caracter. Nesse processo, o bash não conhece realmente o datilógrafo humano de uma máquina.

Normalmente, presto atenção extra ao copiar e colar que não inclui uma nova linha, mas há um truque que você pode tentar: antes de colar, no bash, digite C-x C-e. Ele deve ser iniciado $EDITORcom um arquivo vazio. Tudo o que você salvar nesse arquivo e sair, o bash será executado. Agora você pode colar seu comando no editor, manipular ainda mais as coisas e executá-las de uma só vez.

nperson325681
fonte
-1

Eu não sou parente da empresa, sou um cliente muito satisfeito. Experimente este programa do terminal: http://www.emtec.com/zoc/index.html . Há também uma versão para Mac disponível.

Se eu violar com esta resposta qualquer regra de SE, informe-me e eu a excluo.

Editar:

Quando entendi as outras respostas corretamente, esse problema pode ser causado pelo programa do terminal. O programa do terminal ZOC é um software profissional perfeitamente projetado para o trabalho. Cola o texto que você selecionou sem nenhum caractere adicional. Você pode registrar suas sessões em um arquivo de texto separado. E muito mais

Atualizar:

O programa do terminal tem uma opção Paste without final 'newline'. Pode ser que isso ajude.

Peter VARGA
fonte
3
Por favor, pelo menos dizer como ele responde à pergunta
Stéphane Chazelas
Se você colar uma sequência que contenha caracteres de nova linha ou de retorno de carro no prompt de um shell em execução nesse terminal, o que acontece? Se isso não faz com que o shell execute os comandos imediatamente (como solicitado aqui), como isso acontece? Ele remove esses caracteres da seleção? Ele insere um caractere ^ V antes para escapar para o bash?
Stéphane Chazelas 15/09/16
2
Dessa forma, parece mais spam (embora eu tenha certeza de que não era sua intenção enviar spam para este site). Não responde à pergunta e é apenas propaganda de um produto comercial relacionado.
Stéphane Chazelas 15/09/16
2
@ AlBundy, descubra se o seu cliente de terminal favorito resolve esse problema testando as explorações discutidas em security.stackexchange.com/q/39118 (mencionadas na resposta de Stephane) e os links que você encontrará lá. Se ele o proteger, você tem boas razões para recomendá-lo (forneça os detalhes de seus testes em sua resposta).
alexis
Normalmente, o problema é que o que você selecionou não incluem uma nova linha. Como "cola o texto que você selecionou" é diferente do comportamento normal de qualquer outro emulador de terminal?
Peter Cordes