A referência da Expansão da História do GNU não tem exemplos, então não sei se isso é possível.
Aqui está o que eu quero fazer. Eu corri cat long/path/to/file1.txt | less
, então eu corri vim file2.txt
. Usando a expansão do histórico, eu gostaria de correr, cat even/longer/path/to/file3.txt | less
mas não quero:
- Digite
long/path/to/file1.txt
, pois é inconveniente digitar. - Consulte o comando anterior com um número; quero me referir a ele com uma string. ou seja, Use
!cat...
, mas não!-2...
Isso pode ser feito?
Aqui está o que eu tentei (não funciona):
!cat:^!cat:1^even/longer/path/to/file3.txt^
Aqui está meu processo de pensamento:
!cat
- Substitua o último comando que começou com a stringcat
.:^x^y^
- Substituax
pory
neste comando!cat:1
- Expandir para o primeiro argumento do últimocat
comando, ou seja,long/path/to/file1.txt
even/longer/path/to/file3.txt
– A substituição desse texto expandido
Um motivo óbvio para isso não funcionar é que estou aninhando expansões em expansões: !cat:1
é interpretado como uma string literal.
Recebo esta saída:
long/path/to/file1.txtlong/path/to/file1.txteven/longer/path/to/file3.txt^: No such file or directory
Se você tiver certeza de que originalmente executou o comando com apenas um arquivo (e não ):
cat file1 file2 | less
ou
Como você entendeu (você disse isso na sua pergunta), refere-se à palavra th no comando mais recente que começa com a string “ ”. E, conforme descrito no e no Manual de Referência do Bash , abrevia , e então se refere à palavra th até a última palavra.
!cat:n
n
cat
bash(1)
:n*
:n-$
n
Talvez:
Não sei por que você diria
cat
issoless
,cat file | less
parece tão bobo para mim quantoless file | less
.Geralmente, você quer evitar despejar arquivos diretamente em dispositivos terminais, pois isso pode bagunçar o terminal se o arquivo contiver caracteres de controle. Melhor usar um pager.
Em
zsh
:Invoca um pager e, se você precisar alimentar o conteúdo desse arquivo para um comando, basta chamar a linha de comando ( Up) e adicionar o comando:
Ou:
Ou