Não, o bash não armazena em cache a saída de comandos, uma vez que a saída pode mudar de execução para execução; O bash não tem uma maneira infalível de rastrear se o arquivo foi modificado por outro processo, o que seria crítico, de modo que bash
pudesse dizer se seu resultado em cache ainda era válido ou não.
No entanto, há outras coisas em jogo aqui. Quando você usa um shell (como bash
), você está interagindo simultaneamente com várias partes do sistema. Por exemplo:
- O próprio shell
- GNU Readline, que é uma interface de edição de linha usada por vários shells e outras ferramentas
- A implementação
libc
, que pode causar um comportamento confuso em quase todos os programas de tempos em tempos. - O próprio terminal, que pode ter um comportamento peculiar, e pode realmente responder aos comandos próprios . (Por exemplo, o Backspack e Delete podem estar indisponíveis ou podem ser trocados)
- A janela da GUI na qual o terminal existe dentro (se aplicável). Por exemplo. ele pode ter um IME que permite digitar caracteres Unicode no terminal com uma seqüência de teclas especial (como Ctrl + Deslocamento + u seguido por um número.)
- O kernel, incluindo todos os seus módulos e drivers
- O hardware em si, que, é claro, pode superaquecer, causar curto-circuito, perda de energia, etc.
Nesse caso, eu diria que o maior contribuidor não é bash
em si, mas o mecanismo de armazenamento em cache no nível do sistema de arquivos é implementado no kernel. Uma vez que você tenha lido um arquivo uma vez, uma grande parte dele pode acabar no cache do sistema de arquivos, que é um pedaço de memória reservada para essa finalidade.
Ao executar operações no arquivo uma segunda vez, o shell não aciona uma leitura de hardware físico novamente, mas recupera o conteúdo do arquivo do cache. Quase qualquer operação que você (re) executar no bash será extremamente rápida em comparação com uma leitura de disco. É por isso que você não percebe que o bash está realmente executando novamente os comandos, porque a leitura do disco lento está faltando.