Como posso mover a linha de comando do bash de forma eficiente?

19

Então eu uso o acima no meu shell (Bash no OSX ou Ubuntu, principalmente) mas algumas vezes eu sei que eu quero o material depois do cursor atual localização. Existe alguma maneira de ter a linha completa com a linha acima? Bater para cima e depois para a esquerda é irritante.

Quaisquer outros truques também seriam legais, exceto pela guia , a qual todos nós agora temos:)

Veja um exemplo (por solicitação do quack):

Eu digito mkdir /where/the/hell/is/that/thing e, em seguida, quero fazer o cd no mesmo diretório. Mas agora eu sei sobre meta-b:)

    
por Dan Rosenstark 24.02.2010 / 23:05

6 respostas

11

Tente isto:

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

pressione alt + .

dependendo do seu SO e terminal, você pode ter que digitar      esc então .

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

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

edit: estritamente falando, é meta não alt , então também pode funcionar com a tecla "windows" dependendo de como o seu teclado está configurado ...

    
por 25.02.2010 / 02:41
25

Você deve ler o homem bash em seu sistema, particularmente a seção sobre Readline , pois este é o mecanismo de entrada interativa do bash. O manual do Bash em gnu.org tem uma boa seção em Commandline Editing que ajudará a preencher algumas das lacunas.

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

  • Ctrl + a move para o início da linha (ou Início dependendo das configurações do terminal)
  • Ctrl + e move para o final da linha (ou End ...)
  • Meta + f avança uma "palavra"
  • Meta + b move para trás uma "palavra"

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

  • Ctrl + k mata o texto ("cortes") da posição atual do cursor para o final da linha
  • Ctrl + y yanks ("pastas") o texto mais recentemente eliminado de volta ao buffer no cursor

Então você pode combiná-los para selecionar um pedaço de alguma linha de comando que você deseja repetir, matá-lo e colá-lo no final do próximo comando.

Agora, para torná-lo ainda mais divertido, consideremos a Expansão do Histórico . Isso é que !! que A resposta de Studer menciona . A expansão do histórico é dividida em designadores de evento < a designadores de palavras , e modificadores .

Os designadores

Event se parecem com isso (novamente, veja os links para a lista completa):

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

Word selecionam certas 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 simples.

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

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

$ cd !$

Agora, digamos que você execute alguns outros comandos e, em seguida, queira voltar a esse caminho novamente. Se esse foi o último comando mkdir que você executou, você pode usar isso para repetir esse caminho:

$ tar czf ~/foo.tgz !mkdir:$
    
por 24.02.2010 / 23:47
5

Se você é um usuário 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 depois de digitar Esc + k .

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

por exemplo. Esc + k /smbclient vai dar o último comando smbclient que você digitou. Você pode percorrer todas as pesquisas usando as chaves vi padrão ( j e k para cima e para baixo, mas acho que as setas para cima e para baixo funcionarão também).

Mais ajuda aqui , há também algumas coisas básicas no link que podem ser mais do que você está procurando por.

Felicidades,   Stu.

    
por 24.02.2010 / 23:35
3

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

% test
% echo !!
> test
    
por 24.02.2010 / 23:49
0

No exemplo dado, use! $ para representar o último parâmetro do comando anterior:

mkdir /something/somethingelse

cd !$

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

    
por 25.02.2010 / 02:23
0

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

    
por 25.02.2010 / 03:30