De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rodrigo Bernardo Pimentel
Data de Publicação: 24 de Julho 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:
Variável | Significado |
---|---|
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. |
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. |
Eu, por exemplo, uso HISTSIZE
e HISTFILESIZE
como 5000.
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 caractere 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, é feita 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 (...)
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.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários