Um truque útil de expansão de história no Bash

O Bash está repleto de inúmeros truques que parecem muito inteligentes no início,
mas depois acabam não sendo tão práticos ou ergonômicos.
Tenho experimentado alguns,
tentando me forçar a usar coisas novas,
mesmo que elas não sejam fáceis no início.

Entre os muitos truques que tentei memorizar,
um que sobreviveu muito bem foi o lançamento de história com !$e <kbd> ESC. </kbd>

Se você digitar !$na linha de comando,
ele será substituído pelo último argumento do comando anterior.
Por exemplo, encontro-me com muita frequência neste tipo de situação:

svn status /long/path/somewhere/else
svn revert
-R /long/path/somewhere/else
svn update
/long/path/somewhere/else
svn log
-l3 /long/path/somewhere/else

Eu faço esse tipo de coisa várias vezes por dia,
não necessariamente com comandos do Subversion.
Embora o preenchimento da guia ajude a inserir caminhos rapidamente,
muitas vezes leva várias paradas de tabulação para fazer isso, o
que ainda é uma dor para reinserir um longo caminho.

!$ simplifica muito isso:

svn status /long/path/somewhere/else
svn revert
-R !$
svn update
!$
svn log
-l3 !$

Eu estava relutante em aprender isso porque tinha uma solução alternativa com a qual estava muito acostumado:

  1. Seta <kbd> para cima </kbd> para trazer de volta ao comando anterior
  2. <kbd> Control w </kbd> para copiar o argumento do caminho
  3. <kbd> Control c </kbd> para cancelar o comando
  4. Digite o novo comando, por exemplo como acimasvn revert -R
  5. <kbd> Control y </kbd> para colar o argumento do caminho

Admito que isso parece muito ruim agora, em retrospecto.

!$é relativamente fácil de lembrar, porque !é a chave comum para comandos relacionados ao histórico e $significa “o fim” nas expressões regulares.
Da mesma forma, !^seria substituído pelo primeiro argumento no comando anterior e ^significa “o começo” nas expressões regulares.
De alguma forma, não preciso de !^muito na prática.
Há também !*, que é substituído por todos os argumentos do comando anterior, mas não pelo comando em si.
Você pode usar toda a linha de comando anterior !!.

Uma desvantagem é que você não verá seu valor até que execute o comando. Portanto, se você quiser editá-lo, não pode, o que pode ser irritante. Nesse caso, você pode usar <kbd> ESC. </kbd> em seu lugar. Isso irá colar o último argumento imediatamente, para que você possa vê-lo e editá-lo. Gosto mais da ideia , mas pressionar a tecla <kbd> ESC </kbd> é, de alguma forma, menos ergonômico para mim. Talvez eu só precise me acostumar com isso.!$




!$