
Esta questão é uma variante de umaperguntado anteriormente Como repetir o parâmetro atualmente digitado no console bash?
Muitas vezes, sinto vontade de renomear um pouco o nome de um arquivo no shell, por exemplo:
$ mv test_1.py _test_1.py
ou
$ mv test_1.py test_1.py.org
Eu poderia usar as sugestões emComo repetir o parâmetro atualmente digitado no console bash?, mas
existe algummagia de festaisso me permitirá apenas fazer referência ao parâmetro digitado anteriormente?
por exemplo, se a mágica for $M,
então - para o acima - eu usaria:
$ mv test_1.py _$M.py
$ mv test_1.py $M.org
Responder1
A magia funciona em duas partes.
Primeiro, echo tem o alias de e (echo também funcionará se você não quiser nenhum alias); segundo, usamos "expansão de chaves":
$ e mv {,_}test_1.py # Try to see if it works as expected.
mv test_1.py _test_1.py
# If the arguments are what you want:
$ mv {,_}test_1.py # Press ↑ (up arrow), remove `e`
$ !* # OR: Type `!*` --> last line after arg 0.
$ mv {,_}test_1.py # If `histverify` is set.
O !* pode ser expandido com um espaço se vocêativar o espaço mágicoou se vocêdefinirshopt -s histverify
depois de pressionar enter, você terá a chance de revisar o efeito da expansão do histórico antes de pressionar enter (novamente) para executar.
O outro exemplo:
$ e mv test_1.py{,.org}
mv test_1.py test_1.py.org # The result of the brace expansion.
# Review it, and if it is ok:
$ !* # type !* (use either space or enter)
# That will depend on how you setup it.
$ mv test_1.py{,.org} # The command appear again (enter to execute).
$
Há também a expansão do histórico !#
que significa a linha de comando digitada até o momento e a seleção do primeiro comando :1
. Se você tiver o espaço mágico ativado, digite mv test1.py !#:1
e pressione espaço, o comando mudará:
$ mv test_1.py !#:1 # Press space.
$ mv test_1.py test_1.py # The command line change to this.
$ mv test_1.py test_1.org # Edit and press enter to execute.