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 é:

Exportação Invocação Argumentos Redirecionamento Arquivo

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.txt

Notei 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 é:

  1. Etapa #1: Leitura e Estruturação

    • Leitura de caractere por caractere;
    • Separação do comando em palavras via metacaracteres;
    • Expansão de apelidos (alias).
  2. Etapa #2: Mapeamento do comando

    • Mapeia a estrutura segundo a ocorrência de operadores do shell e palavras reservadas.
  3. Etapa #3: Execução do comando

    • Processamento de expansões;
    • Lapidação da separação de palavras;
    • Remoção de caracteres de citação.
  4. Etapa #4: Execução de redirecionamentos.

  5. 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 !

Há ainda a citação ANSI-C, que converte um código em caractere ASCII. Exemplo: \bBackspace.

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.