você está aqui: Home  → Arquivo de Mensagens Como melhorar a sua fluência no inglês com apenas 10 minutos por dia

Bash History

Colaboração: Rodrigo Bernardo Pimentel

Data de Publicação: 17 de Agosto de 2000

O "history" (ou histórico) no bash, apesar de extremamente poderoso, é muito pouco usado, além do tradicional "setinha pra cima" para exibir os últimos comandos.

Seu comportamento é regido por algumas variáveis:

HISTSIZE Tamanho (em número de comandos) do histórico.
HISTFILE Arquivo em que serão salvos os comandos (normalmente
HISTFILESIZE Tamanho máximo (em linhas) do arquivo selecionado acima. Se um valor for especificado, o arquivo será truncado para conter apenas o número especificado de linhas.

Eu, por exemplo, uso HISTSIZE e HISTFILESIZE como 5000.

Outra variável interessante é

HISTCONTROL Pode ter um dentre três valores: ignorespace, ignoredups ou ignoreboth. Se usar o primeiro, comandos começando com espaço não vão para o histórico. Com o segundo (e isso é particularmente interessante), se um comando é executado mais de uma vez em seguida, só uma ocorrência vai para o histórico. O terceiro implementa ambas as funcionalidades.

Finalmente, para quem costuma quebrar comandos em várias linhas (quem sabe isso não vai em outra dica? ;) , pode ser interessante fazer

export command_oriented_history=1

(ou qualquer outro valor, basta a variável estar "setada") Isso faz com que o bash tente salvar todas as linhas do comando, ao invés de salvar cada linha como se fosse um comando diferente (o comportamento padrão).

O caracter associado ao histórico é ! (exclamação). Aqui, é mais fácil compreender com a ajuda de exemplos:

!bla repete o último comando começando com bla.
!?bla repete o último comando contendo bla.
!x repete o comando de número x no histórico.
!-y repete o y-ésimo comando, do atual pra trás.
!! repete o último comando (ou seja, igual a !-1)
!# repete tudo o que foi digitado na linha até aquele ponto. Por exemplo, ls !# geraria ls ls

Depois de especificada a linha de que se quer tratar (com os comandos anteriores), pode-se selecionar parte delas e modificá-la. Esse tratamento das linhas é introduzido por : (dois pontos).

A seleção, em sua forma mais simples, é feito indicando-se um número relativo à posição do argumento que você quer selecionar no comando (0 - zero - é o comando em si). Assim, por exemplo

[rbp@muppets ~]$ ls bla
ls: bla: No such file or directory
[rbp@muppets ~]$ !!:0
ls

A linha !!:0 pegou a última linha e executou só o "argumento zero" (o comando em si). Poderíamos também fazer algo como:

[rbp@muppets ~]$ man xscreensaver
[rbp@muppets ~]$ !!:1
xscreensaver

Pode-se selecionar uma seqüência de argumentos, com x-y (do argumento de número x ao de número y, inclusive). Por exemplo,

[rbp@muppets ~]$ cat script1 script2 script3
(...)
[rbp@muppets ~]$ !!:1-2
script1 script2
(...)

[rbp@muppets ~]$

Complementando ^ é o argumento de número 1 (isto é, o primeiro argumento depois do comando em si), $ é o último. Podem-se fazer abreviações como x- (igual a x-$), -x (igual a 1-x) ou * (igual a 1-$).

Para se modificar o comando em questão (ou a porção selecionada dele), o método mais comum é muito semelhante ao sed:

[rbp@muppets ~]$ mkdir diretorio1
[rbp@muppets ~]$ !!:s/1/2
mkdir diretorio2

O s/1/2 substituiu 1 por 2 no comando anterior.

Juntando tudo:

[rbp@muppets ~]$ export EDITOR=emacs
[rbp@muppets ~]$ !!:1:s/EDITOR=//
emacs

Finalmente, uma dica: substituição do último comando executado pode ser feita rapidamente com

^a^b - substitui a por b no último comando.



Veja a relação completa dos artigos de Rodrigo Bernardo Pimentel