Gostaria de saber se é possível repetir parte de um comando (que ainda não foi executado) na mesma linha (ou seja, encadeado).
Digamos que eu queira executar este comando
mkdir -p /some/long/dest/path && rsync -azP /some/long/src/path /some/long/dest/path
É possível digitar apenas algo semelhante a
mkdir -p /some/long/dest/path && rsync -azP /some/long/src/path /path/at/x:2
Obviamente, x:2
é o índice no array do último comando executado , então gostaria de saber se é possível encadear strings e reutilizar o comando na x
posição da string atual.
Você pode usar a função de edição de linha para pegar o
mkdir
argumento e colá-lo no final da linha. (Eu usovi
a edição de linha -style para que seja muito simples: ESC para entrar no modo de edição,0WW
pular para omkdir
caminho,yW
puxar o caminho ep
colá-lo depois. Suponho que haja um equivalente naemacs
edição de linha -style padrão. )Alternativamente,
Ou possivelmente, já que esta é uma sessão interativa, veja o
mkdir
resultado por inspeção :Caso você não tenha encontrado antes,
!$
é uma substituição para o último argumento ($
) do último comando. Está emman bash
(entre outros). Tente isso para ver como ele se comporta:Os itens são referenciados a partir de zero, então
echo !!:0
etc.Não conheço nenhuma maneira de referenciar um argumento na linha de comando atual
history
usando esses operadores de estilo.Tenho idade suficiente para me lembrar de terminais impressos (para vocês crianças, imaginem uma impressora com teclado) e acredito que essa edição de linha de comando estilo editor é uma moda que não vai durar muito mais tempo. :-)
Mas, falando sério, vejo que não sou o único que ouviu falar da
!
história do comando -style. Isso é discutido em detalhes em bash(1) ; consulte a seção HISTÓRICO . Aqui está um breve resumo (ou seja, uma lista de exemplos com algumas dicas sobre as formas generalizadas):exemplo
!number
;!42
history
lista; isso fica complicado se houver exclusões ou truncamentos.!-number
;!-1
,!-2
,!-42
!-1
é o comando mais recente;!-2
é o comando antes disso, etc.-1
é o padrão no sentido de que!-1
pode ser abreviado!!
e (veja abaixo) pode ser abreviado .!-1:something
!:something
thing1:thing2
thing1
modificado por . Uma coisa pode ter vários modificadores. Veja exemplos abaixo.thing2
:number
ls -l foo
, então!:0
=ls
,!:1
=-l
, e!:2
=foo
.:$
:$
pode ser abreviado$
.:h
dirname
.:t
basename
.Uma construção que parece ser menos conhecida é
!#
fazer referência ao comando atual . Então seucomando pode ser digitado como
onde
!#:2
você obtém a segunda palavra (/some/long/dest/path
) deste comando.E, se os
rsync
argumentos são realmente quase adjacentes, como seu exemplo sugere, você pode ir ainda mais longe e dizeronde
!#:2:h:h
é um exemplo de uma coisa com vários modificadores —dirname(dirname(!#:2))
=/some/long
. Poderíamos até dar um passo adiante:mas, se
basename(!:2)
for realmente, literalmente “path
”, então isso é realmente mais digitação.