Colar alguns comandos consecutivos em paradas de terminal em comandos com entrada do usuário, por exemplo:
read VAR
echo $VAR
ou
select VAR in 1 2 3; do break; done
echo $VAR
echo $VAR
não está sendo colado/executado.
Ter todos os comandos em uma única linha funciona:
read VAR; echo $VAR
Mas isso não é preferível quando há mais comandos a seguir.
Por que esse é o caso e como contornar isso?
Meu caso de uso é ter alguns comandos recorrentes em uma documentação de serviço.
É claro que eu poderia escrever um script, mas não é isso que pretendo fazer e pode não ser possível em sistemas com acesso somente de leitura.
Uma maneira muito confortável é a seguinte :
Basta digitar o seguinte no seu terminal:
(
paste-your-multiline-script-here
)
enterDescrição longa :
No terminal você começa com
(
Opcional: Pressione enter(somente por motivos de formatação)
Agora você pode colar várias linhas
por exemplo:
echo hello
echo world
Alternativa: Você digita/cola linha por linha (finalizando cada uma com a entertecla).
Por fim, digite a finalização
)
e aperte enternovamente, que executará todas as linhas coladas/inseridas.Pequeno exemplo de trabalho (para colar linha por linha com enter) :
Pequeno exemplo de trabalho (para colar o script inteiro) :
Pequeno exemplo de trabalho negligenciando a formatação (para colar o script inteiro) :
Quando você cola os dois comandos a seguir em um shell:
... o primeiro diz ao shell para ler uma linha de texto na variável chamada
VAR
. Você fornece esse valor na próxima linha; acontece de ser um comando que você pensou que seria executado.Imprima o valor da
VAR
variável e você verá:A mesma coisa acontece com o
select
cardápio.Eu sugiro que, se sua documentação/comandos esperam que o usuário insira um valor, você insira comentários para esse efeito:
(O usuário insere um valor)
Isso pode ser feito colocando
\
no final de cada linha antes de copiá-la.Você pode obter este trabalho como você quer exatamente como você estava fazendo. Eu faço isso toda hora.
Se você estivesse usando zsh e um terminal que colocasse suas pastas entre colchetes com sequências de escape especiais como urxvt, ele já teria funcionado como você queria por padrão. Se você estiver usando o bash, você só precisa ativar sua interpretação de colchetes fazendo
bind 'set enable-bracketed-paste on'
. Ele aguardará que você pressione Enter antes de executar o que você colou. A esse respeito, a diferença entre bash e zsh é que o bash separará os comandos que você colou no histórico, de modo que por 2 linhas você precisaria pressionar Up, Up, Enter, Up, Up, Enter, enquanto o zsh mantém os comandos colado agrupado como um no histórico, não importa quantas linhas, Up, Enter.Há mais disso escrito nas respostas a seguir. O segundo é meu e inclui uma tabela de terminais que suportam colchetes. Se você acabar usando o urxvt, recomendo instalar a extensão que incluí na resposta para evitar a vulnerabilidade sobre a qual a pergunta era:
https://security.stackexchange.com/a/52655/132634
https://security.stackexchange.com/a/184112/132634
EDIT: A propósito, apenas para ser mais explícito caso você tenha perdido, se você não estiver fazendo isso (usando colchetes), você está aberto à injeção de código shell quando estiver colando de sites. Afinal, os sites podem ocultar o código de várias maneiras e fazer com que você o copie sem o seu conhecimento.
Verifique este site, para ver se você está vulnerável:
http://thejh.net/misc/website-terminal-copy-paste
Parece que você estaria executando:
quando, na realidade, você estaria executando algo assim (removi um byte de escape não imprimível):