Modificadores e Indicadores

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 [*]


Tabela 3.4: Modificadores e indicadores de argumentos da história do tcsh.
OPERADOR EFEITO
:* todos os argumentos, exceto o zero
: $ \widehat{\ }$ o primeiro argumento
:$ o último argumento
:$ n$ o $ n$-ésimo argumento
:$ p-q$ do argumento $ p$ ao $ q$
:$ -q$ abrevia :$ 0-q$
:$ p*$ argumento $ p$ até o último
:p imprime o comando mas não executa
:s/l/r/ substitui l por r
:& repete a substituição anterior


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. $ !\widehat{\ }$ 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