Como edito linhas anteriores em um comando de várias linhas no Bash?

24

Ao inserir um comando que abrange várias linhas no Bash, como edito as linhas anteriores? Sou usuário do Linux Mint (Lisa) usando o Terminal GNOME.

Por exemplo, digamos que eu digite:

$ echo "foo bar
> baz
>

E então, quando estou prestes a digitar a terceira linha do comando, de repente percebo que quero que "foo" e "bar" estejam em linhas separadas. Como reposicionaria meu cursor entre "foo" e "bar", de modo que eu pudesse pressionar enter e colocá-los em linhas separadas?

(Não é fácil como você imagina. A seta para cima não funciona, nem Ctrl-P. Por favor, experimente antes de postar! Obrigado!)

Asher Walther
fonte
A resposta aceita diz que não há solução, mas existe. Veja abaixo
cdosborn

Respostas:

16

Infelizmente, isso depende bash, não do terminal. Suas opções são:

  1. Use ponto-e-vírgula em vez de novas linhas, embora mesmo assim você não possa mover uma linha da tela por vez, mas precise usar comandos de movimento de caracteres ou palavras. (Estranhamente, zshpelo menos, você pode mover-se dentro de um comando composto ao editar o histórico, mas não dentro do comando atual .) Às vezes fc(que o lança ao editor com o comando anterior) é a maneira mais fácil de lidar com comandos compostos.

  2. Se você estiver usando o Bash, use a seguinte combinação de teclas:

    ctrl x e

    Ele abrirá o comando no qual você está trabalhando usando seu editor de texto. Salve o arquivo e saia. (Encontrei o comando na apresentação do Shell Hater .) Os usuários do Zsh têm essa alternativa .

geekosaur
fonte
11
A página de manual do bash explica como alterar qual editor é usado: comando editar e executar (C-xC-e) - Invoque um editor na linha de comando atual e execute o resultado como comandos do shell. Bash tenta chamar $ VISUAL, $ EDITOR e emacs como editor, nessa ordem.
Matthew
Existe uma solução, sem abrir o editor.
cdosborn
Tecnicamente, não depende do bash - mas da biblioteca "readline" que o bash usa para obter entradas.
Christian Herenz 18/10/19
11

A solução é nunca inserir um comando até que a linha múltipla esteja correta, basta digitar: CtrlvCtrlj quando você quiser ir para a próxima linha. Metabvoltar uma palavra.

solução

crédito para a resposta de @ rici

cdosborn
fonte
4

Curiosamente, Ctrl+Cé o que você está procurando.

quando você estiver

$ echo "foo bar
> baz
>

basta pressionar Ctrl+C(a linha de comando editada será suspensa) e pressionar Up(histórico anterior). Sua solicitação será: (observe a ausência de>)

$ echo "foo bar
baz

Agora você pode se movimentar com Left Rightsaltos de linha uniformes.

Há apenas uma peculiaridade; você deve estar no último caractere para adicionar outra linha; portanto, mova-se para editar as linhas existentes (vá para o início Ctrl+A), pressione Enter se isso for suficiente ou vá para final ( Ctrl+E) para adicionar mais linhas Enter. Outra desvantagem é que Ctrl+_(desfazer) restaura apenas as alterações da últimaCtrl+C

albfan
fonte
-2

Copie os comandos e cole-os no bloco de notas e formate-os a partir daí. Depois disso, você pode copiar seus comandos de volta para o terminal.

Pacheko
fonte