Como posso excluir um caractere de nova linha recém-digitado no bash?

6

Às vezes, copio e colo caminhos no terminal e, muitas vezes, copio acidentalmente o caractere de nova linha. Por exemplo, quero encontrar e ler o conteúdo de foobar.txt .

$ locate foobar.txt
/home/sparhawk/Document Directory/foobar.txt

Em seguida, seleciono a segunda linha com um clique triplo. (Opa, ele seleciona a nova linha à direita também!) Como há um espaço no caminho, preciso delimitar o caminho entre aspas. Por isso, digite

$ cat '

e meio clique para colar. Isso produz

$ cat '/home/sparhawk/Document Directory/foobar.txt
> 

desde que eu insira uma nova linha antes de fechar o ' . Neste ponto, não posso pressionar backspace para excluir a nova linha. Existe uma maneira de excluir esta nova linha recém-digitada?

Mais informações

Neste ponto, posso SIGINT com Ctrl + c ou completar a cotação com outro ' . Digamos que eu faça o último.

$ cat '/home/sparhawk/Document Directory/foobar.txt
> '
cat: /home/sparhawk/Document Directory/foobar.txt
: No such file or directory

o que faz sentido, pois acabei de digitar um caminho com nova linha nele. No entanto, neste momento, eu posso pressionar a seta para cima, para carregar o último comando. ou seja,

$ cat '/home/sparhawk/Document Directory/foobar.txt
'

Neste ponto, eu posso pressionar o backspace duas vezes para excluir a nova linha. (N.B. não há > no segundo exemplo da história).

    
por Sparhawk 07.10.2013 / 12:46

1 resposta

5

O Bash usa Biblioteca GNU Readline para entrada e edição de linha de comando. Infelizmente esta biblioteca processa a entrada apenas linha por linha. A readline() chamada retorna após terminar a linha pressionando Enter . A próxima linha (depois de mostrar o prompt $PS2 " > ") é processada por uma chamada readline() separada.

Quando você volta no histórico de edição para uma entrada de várias linhas, Readline trata a entrada como uma única "linha" com novas linhas (os prompts $PS2 não são exibidos) para que você possa editar toda a entrada de várias linhas como você descreveu.

Eu uso o seguinte truque para resolver o problema que você apresentou: Quando eu introduzo uma nova linha indesejada, eu a cancelo pressionando Ctrl + c . Então eu volto para a entrada cancelada pressionando (ou Ctrl + p ). Então eu posso remover a nova linha por Backspace e fazer outras edições.

Entre com uma nova linha indesejada no final, pressionando Ctrl + c :

$ cat 'xyz
> ^C

Depois de pressionar , a entrada retorna o evento sem a nova linha:

$ cat 'xyz
    
por 07.10.2013 / 18:07