O que é um comando? O professor Blau inicia com essa questão, e sua resposta fez-me recordar o que dizem os autores do livro Estrutura e Interpretação de Programas de Computador: a ciência da computação é sobre o conhecimento imperativo, aquele que dita o que deve ser feito. No entanto, o Blau utiliza uma definição que melhor me agradou: comando é “a vontade do utilizador expressa na forma de texto, (…) numa linguagem que o shell consiga interpretar”.
Portanto, tudo o que se escreve precisa ser inteligível e legível; por esta segunda parte, a tipografia é a responsável, cabendo-nos apenas o zelo pela primeira. A estrutura sintática correta para o shell é:
Assim, ao digitar ls no emulador de terminal, estou
invocando o programa ls; se, após o espaço, digito
-la, estou passando os argumentos; e posso redirecionar o
resultado para um arquivo utilizando > nome_arquivo.txt.
Mas o que viria a ser a exportação? O professor Blau
forneceu um bom exemplo, todavia, não me senti satisfeito; realizei
buscas, questionamentos e cheguei ao seguinte entendimento: a exportação
é a definição de valores a variáveis no ambiente de execução do
processo.
Com isso, compreendi o que estava óbvio, porém oculto para mim: a exportação, a invocação e o redirecionamento + arquivo podem ser comandos independentes. Exemplo:
# Exportação
PATH="/home/usuario/scripts:$PATH"
# Invocação
ls
# Redirecionamento
> log.txt
< log.txtNotei que a exportação será útil apenas para o ambiente em execução;
o ls executará normalmente, pois prescinde de argumentos;
contudo, o grep, como demonstrado pelo professor Blau,
exigirá um argumento, e o redirecionamento isolado será inútil, afinal,
não haverá o que redirecionar (> log.txt) ou para o que
redirecionar (< log).
Ps. Após redigir estas notas, notei que, na wiki, o professor aborda explicitamente o comando sem invocação. Caso tenha sido mencionado em aula, a explicação me passou despercebida, mas sinto-me satisfeito por ter alcançado essas conclusões.
0.0.1 Etapas de processamento de comandos
No Issues #4, um aluno faz uma pergunta que resultou em uma excelente explicação do professor sobre os processos. O meu entendimento desta seção é:
Etapa #1: Leitura e Estruturação
- Leitura de caractere por caractere;
- Separação do comando em palavras via metacaracteres;
- Expansão de apelidos (
alias).
Etapa #2: Mapeamento do comando
- Mapeia a estrutura segundo a ocorrência de operadores do shell e palavras reservadas.
Etapa #3: Execução do comando
- Processamento de expansões;
- Lapidação da separação de palavras;
- Remoção de caracteres de citação.
Etapa #4: Execução de redirecionamentos.
Etapa #5: Monitoramento de estados de término.
0.0.1.1 Metacaracteres
Metacaracteres são caracteres cuja função é delimitar palavras,
podendo ter sua natureza alterada quando citados. São eles:
|, &, ;, (,
), <, ou >.
0.0.1.2 Citação
A citação é, conforme o manual do Bash, o meio para remover o significado especial de certos caracteres ou palavras. Tipos de citação:
\preserva o valor literal do próximo caracter;' 'preserva o valor literal de todo seu escopo;" "preserva o valor literal de todo seu escopo, com exeção de:- Indcondicional:
$e` - Condicional:
\e!
- Indcondicional:
Há ainda a citação ANSI-C, que converte um
código em caractere ASCII. Exemplo:
\b → Backspace.
0.0.1.3 Apelidos
Enquanto uma variável é um contêiner que armazena valor, um apelido
(alias) é um recurso inerente ao shell para criar atalhos para cadeias de caracteres
(strings), seguindo a estrutura
alias nome_do_atalho='string'. É invocado como
nome_do_atalho quando posicionado como a primeira palavra
do comando.