Como posso mover a linha de comando do bash com eficiência?

19

Então, eu uso o upno meu shell (Bash no OSX ou Ubuntu, principalmente), mas algumas vezes sei que quero o material após a localização atual do cursor. Existe alguma maneira de ter a linha que eu estou completa com a linha acima? Bater upe depois lefté chato.

Quaisquer outros truques também seriam legais, exceto tab, sobre o que todos nós estamos falando agora :)

Aqui está um exemplo (por solicitação do ~ quack):

Eu digito mkdir /where/the/hell/is/that/thinge quero cd no mesmo diretório. Mas agora eu sei sobre meta-b :)

Dan Rosenstark
fonte
1
um exemplo explícito seria incrível.
quack quixote
@ ~ quack fazendo exemplo agora
Dan Rosenstark
1
aqui está um (duplicada) pergunta relacionada, com uma resposta bastante agradável: superuser.com/questions/124336/...
cregox

Respostas:

11

Tente o seguinte:

mkdir /where/the/hell/is/that/thing

depois pressione alt+.

dependendo do seu sistema operacional e do terminal que você pode ter que digitar esc, em seguida,.

Você também pode pressionar alt+ 1+ .para selecionar um argumento anterior específico.

Isso é muito melhor do que !! ou! $ porque você pode realmente ver o que está prestes a executar e, de qualquer maneira, leva menos pressionamentos de tecla.

editar: a rigor, metanão é alt, portanto, também pode funcionar com a tecla "windows", dependendo da configuração do teclado.

user23307
fonte
interessante! não sabia sobre isso.
quack quixote
2
@justin isso é incrível. No OSX meta é escapar.
Dan Rosenstark
@yar com o OS X Terminal, também há uma configuração de preferência em 'Configurações' -> 'Teclado' para 'usar a opção como meta-chave'.
9788 Thomas
Obrigado @ThomasW, tenho de voltar a este assunto. Estou na linha de comando diariamente, mas use muito pouco dos truques.
Dan Rosenstark 5/10/12
28

Você deve ler o man bash no seu sistema, particularmente a seção Readline , pois esse é o mecanismo de entrada interativo do bash. O manual do Bash em gnu.org tem uma boa seção sobre Edição de Linha de Comando que ajudará a preencher algumas das lacunas.

Por padrão, você pode usá-los para percorrer a linha de comando (apenas listando alguns aqui; consulte o link para obter uma lista completa):

  • Ctrl+ amove para o início da linha (ou Homedependendo das configurações do terminal)
  • Ctrl+ emove para o final da linha (ou End...)
  • Meta+ favança uma "palavra"
  • Meta+ bretrocede uma "palavra"

Você pode usá-los para "matar" (também conhecido como "cortar") o texto de uma linha:

  • Ctrl+ kmata ("corta") o texto da posição atual do cursor até o final da linha
  • Ctrl+ ypuxa ("cola") o texto morto mais recentemente para o buffer no cursor

Assim, você pode combiná-las para selecionar um pedaço de alguma linha de comando que deseja repetir, eliminá-la e colá-la no final do seu próximo comando.


Agora, para torná-lo ainda mais divertido, vamos considerar a expansão do histórico do bash . É isso !!que a resposta de Studer menciona . A expansão do histórico divide-se em designadores de eventos , designadores de palavras e modificadores .

Os designadores de eventos têm esta aparência (novamente, veja os links para a lista completa):

  • ! - inicia uma substituição do histórico
  • !n- o n-ésimo comando na lista de histórico do bash, para algum número inteiro n (funciona também para negativos)
  • !!- o comando anterior; equivalente a!-1
  • !string- o comando mais recente começando com string

Designadores de palavras selecionam determinadas partes de um evento. Use :para separar o evento do designador de palavras. As palavras são numeradas de 0 a partir do início da linha e inseridas na linha atual, separadas por espaços únicos.

  • $- designa o último argumento (por exemplo, !!:$é o último argumento do último comando; pode ser reduzido para !$)
  • n- designa a n-ésima palavra (por exemplo, !str:2é o segundo argumento do comando mais recente que começa com str ; !!:0é o comando do último comando)

Portanto, para acompanhar o seu exemplo, se o seu último comando for mkdir /some/really/long/path, apenas a execução !!executará o comando novamente. Mas você deseja cdseguir esse caminho:

$ cd !$

Agora, digamos que você execute alguns outros comandos e, em seguida, deseje voltar ao caminho novamente. Se esse foi o último comando mkdir que você executou, você pode usá-lo para repetir esse caminho:

$ tar czf ~/foo.tgz !mkdir:$
charlatão quixote
fonte
você também pode vincular esses (e outros comandos do Readline) a qualquer combinação de teclas que desejar; consulte a seção 8.4 do manual, Comandos vinculados da linha de leitura : gnu.org/software/bash/manual/… e a seção 8.3, arquivo inicial da linha de leitura
Quack Quixote
obrigado que realmente ajuda. Embora "leia o manual" fosse o tipo de esperado, mencionar o movimento básico das ligações ajuda. Mesmo apenas o conhecimento de ctrl-a pode ser uma economia real.
Dan Rosenstark
@quack, não há problema, eu peguei uma revisão posterior, na verdade :)
Dan Rosenstark
1
observe também bind -pou bind -Pimprimirá as combinações de teclas atuais; essa é a referência definitiva para o que o seu bash usa.
quack quixote
1
Acho que essa resposta aumentou: o material sobre a expansão da história é ótimo.
Dan Rosenstark
6

Se você é um usuário do vi, pode colocar o shell no modo vi digitando set -o vi.

Você pode fazer todos os tipos de coisas poderosas na linha de comando após digitar Esc + k.

O que eu uso mais é Esc+K, em seguida, /qualquer texto digitado após a barra será usada para pesquisar seu histórico de linha de comando.

por exemplo Esc + k /smbclient , dará o último comando smbclient digitado. Você pode rolar por todas as pesquisas usando as teclas vi padrão ( je kpara cima e para baixo, mas acho que as setas para cima e para baixo também funcionarão).

Para obter mais ajuda aqui , também existem algumas coisas bash embutidas nesse link que podem ser mais o que você está procurando.

Saúde, Stu.

Stuart Brock
fonte
enquanto o modo vi é inútil para mim, já que ainda não o vi, a tinta l é incrível. Obrigado por isso!
Dan Rosenstark
1
O equivalente sem o modo vi é ctrl-r. Digite e, em seguida, parte de um comando anterior. Ele exibirá a última ocorrência do que foi digitado. Pressione ctrl-r novamente para chegar ao próximo. Muito conveniente.
Nerdfest
3

Você pode usar o !!que representa o último comando:

% teste
% eco !!
> teste
Studer
fonte
interessante. Não tenho certeza se quero manipular essa string usando ... o quê?
Dan Rosenstark
isso faz parte das instalações de histórico do bash: gnu.org/software/bash/manual/… .. particularmente a expansão do histórico: gnu.org/software/bash/manual/bashref.html#History-Interaction ... note !!é um sinônimo para !-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
quack quixote
2
Isso é realmente útil para quando você esquecer de usar o sudo: ie sudo !! - $ more / etc / sudoers / etc / sudoers: permissão negada $ sudo !! sudo more / etc / sudoers [sudo] senha para ..: # / etc / sudoers ... ... ...
user9632
@wookiebreath, obrigado por isso, vou votar esta resposta até agora
Dan Rosenstark
0

No exemplo que você fornece, use! $ Para representar o último parâmetro do comando anterior:

mkdir / algo / algo mais

cd! $

Você também pode usar variações numeradas para extrair parâmetros específicos dos comandos anteriores.

Nerdfest
fonte
0

Recentemente, achei esta folha de dicas readline muito útil. Muitas coisas que eu não sabia. Eu costumava usar !$o tempo todo até descobrir o Alt+ ., que agora uso o tempo todo. :)

Fredden
fonte