Embora todos estes recursos sejam valiosos para abreviar a quantidade de texto digitado pelo usuário, são pouco frequentes as situações em que uma seqüência de comandos é executado várias vezes da mesma maneira. Normalmente deseja-se fazer pequenas modificações nestes comandos e então reexecutá-los. Este é o caso de repetir-se o mesmo processo em vários arquivos, corrigir erros de digitação ou testar novos parâmetros dos aplicativos. Para esse fim o manipulador da história do shell inclui os modificadores da história. Os modificadores servem para que se repita os comandos da história alterando-os antes de sua execução. Os principais estão listados na tabela
Os argumentos são nomeados a partir de zero (o nome do comando), conforme o esquema abaixo.
$ ls discos livros telas ...
0 1 2 3 ...
Tomando este comando como exemplo, poderíamos usar os indicadores de argumentos da tabela para selecionar cada um dos argumentos das linha de comando anterior. Por exemplo, * seria substituído por discos livros telas. Então, usando * reaproveitamos todos argumentos do ls numa nova operação.
$ rm *
rm discos livros telas
agora, rm discos livros telas é o comando mais recente da história, de maneira que referir-se-ia a ele e não mais ao ls .... Para selecionar um só argumento da linha de comando anterior, usamos os indicadores de argumentos. seria substituído por discos, $ por telas, :2 por livros, :2-3 por livros telas e assim por diante. Novamente, explore a tabela com criatividade.
Os modificadores e indicadores da história podem ser superpostos, desde que não sejam contraditórios. Além disso, podem referir-se a qualquer comando da história e não só ao último. Nos exemplos acima, bastaria incluir o número do comando logo após o ponto de exclamação para que o shell refira-se a outro comando que não o último. Se examinamos a história listada no início desta seção (página ) poderíamos editar o arquivo Makefile recém criado, simplesmente digitando
$ vi !128:1
vi Makefile
se quiséssemos apenas fazer a substituição e colocá-la na história sem executar o comando em si, bastaria acrescentar o :p na linha substiuição acima
$ vi !128:1:p
vi Makefile [COMANDO NÃO EXECUTADO]
e assim sucessivamente poderíamos empilhar modificadores e indicadores para se referir a comandos passados.
Em suma, o recurso de registro, edição e procura da história facilita o processo de edição de comandos, agilizando o processo de digitação e abreviando a tarefa de memorização de nomes de arquivos. Neste ponto fica difícil evitar a analogia com a vida real, onde também se aprende com os fatos passados. Sem atribuir ao shell propriedades da natureza humana, é o conhecimento da nossa história que nos permite evoluir.
leon 2008-08-19