AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 793214
Accepted
Daniel Kaplan
Daniel Kaplan
Asked: 2025-04-02 02:58:39 +0800 CST2025-04-02 02:58:39 +0800 CST 2025-04-02 02:58:39 +0800 CST

Usando a expansão de histórico do bash, você pode substituir o primeiro argumento da última vez que um comando foi executado, quando não é o comando mais recente?

  • 772

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 | lessmas 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:

  1. !cat- Substitua o último comando que começou com a string cat.
  2. :^x^y^- Substitua xpor yneste comando
    1. !cat:1- Expandir para o primeiro argumento do último catcomando, ou seja,long/path/to/file1.txt
    2. 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
bash
  • 2 2 respostas
  • 48 Views

2 respostas

  • Voted
  1. Best Answer
    G-Man Says 'Reinstate Monica'
    2025-04-02T06:06:42+08:002025-04-02T06:06:42+08:00

    Se você tiver certeza de que originalmente executou o comando com apenas um arquivo (e não ):cat file1 file2 | less

    cat even/longer/path/to/file3.txt !cat:2*
    

    ou

    !cat:0 even/longer/path/to/file3.txt !cat:2*
    

    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:nncatbash(1):n*:n-$n

    • 1
  2. Stéphane Chazelas
    2025-04-02T15:12:53+08:002025-04-02T15:12:53+08:00

    Talvez:

    pager !cat:1:s:long:even/longer:
    

    Não sei por que você diria catisso less, cat file | lessparece tão bobo para mim quanto less 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:

    <file
    

    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:

    <file cmd
    

    Ou:

    <file cmd | pager
    

    Ou

    <file cmd >output
    
    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve