Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
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
/.bash_history).
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 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. Similarmente,
!-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.
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.




