CI067, 2018-2 © Roberto André Hexsel, 2017-18
Antes de mais nada, crie um prompt vazio,
copiando a linha abaixo no seu terminal
alias prompt:=""
Três clicks no botão esquerdo para copiar, um click no meio para colar.
Main, variáveis de ambiente, valor de retorno
Vejamos como um programa se comunica com seu ambiente de execução.
Um programa pode obter informações do ambiente em que executa, que é a
shell de onde foi invocado, e pode fornecer informação ao ambiente
através de seu valor de retorno.
Variáveis de ambiente da shell e main
Uma variável de ambiente é um nome simbólico para alguma informação
necessária para a execução da shell, ou para programas invocados
pela shell. No nosso caso, a shell é chamada de BASh,
ou Bourne Again Shell, assim denominada porque é uma reescrita
da shell original, escrita por Stephen Bourne, que não era o espião
assassino do cinema.
Por exemplo, a variável de ambiente SHELL é inicializada automaticamente
para /bin/bash.
Quando estiver trabalhando diretamente com Bash, para atribuir um valor a
uma variável, diga
prompt: VAR=VALOR
Para de-referenciar o conteúdo de uma variável, diga
prompt: echo $VAR
O comando echo ecoa seu(s) argumento(s) de linha de comando, e no
caso de variáveis de ambiente, o '$' faz com que a variável seja
de-referenciada e seu conteúdo exibido.
A execução de
prompt: echo SHELL $SHELL
ecoa o primeiro argumento, que é a string "SHELL", e de-referencia a
variável SHELL, cujo valor é /bin/bash.
Diga
prompt: help echo
para uma descrição sucinta do comando.
Main e seu ambiente de execução
A programadora de C pode acessar os conteúdos de todas as variáveis de
ambiente através do envp ou environment pointer.
A variável envp aponta para um vetor de strings, cada uma
delas sendo uma variável mais seu conteúdo:
SHELL=/bin/bash
USER=roberto
PAPERSIZE=a4
LANG=en_US.UTF-8
EDITOR=emacs
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/home/roberto/bin:.
Como o ambiente pode ter tamanho arbitrário, o vetor de strings é
terminado com uma string vazia ('\0').
As variáveis SHELL e USER são imutáveis: Bash não permite que estas
variáveis sejam alteradas. As variáveis PAPERSIZE, LANG, EDITOR e PATH
permitem que o usuário da shell configure seu ambiente de execução.
O comando env mostra na tela todas as variáveis de ambiente, e a
programadora pode acessar "o ambiente" para reconfigurar seu programa em
tempo de execução, de acordo com os desejos do usuário, como expressos em
seu ambiente de execução.
Diga
prompt: man bash
para ver o significado de uma boa parte das variáveis do seu ambiente.
Note que há um bocado de complexidade na configuração de Bash, e entender
tudo não é o objetivo desta aula, nem desta disciplina. Não gaste mais do
que 5 minutos estudando as variáveis de Bash.
Copie para sua área de trabalho o arquivo que é a base para o trabalho
proposto neste laboratório com
prompt: wget www.inf.ufpr.br/roberto/ci067/a19_main.c
O que o programa faz é exibir todas variáveis do ambiente de execução
da shell em que é executado.
Compare a saída do programa com a saída do comando env.
Diga
prompt: man env
para ver as possibilidades.
Acrescente a variável XXX ao seu ambiente:
prompt: XXX=yyy
verifique se o seu ambiente cresceu:
prompt: env | grep XXX
O programa "enxerga" a nova variável?
prompt: ./a.out | grep XXX
A variável XXX foi acrescentada ao ambiente de execução desta
shell, mas a variável não é automaticamente exportada para os
programas disparados nesta shell. Para que os outros
programas enxerguem uma variável de ambiente, esta deve ser exportada:
prompt: export XXX=yyy
prompt: ./a.out | grep XXX
Diga
prompt: help export
para ver as possibilidades.
Note que export e echo são comandos de Bash e não programas
autônomos tais como /bin/bash e /usr/bin/env. Por isso usamos help
ao invés de man para ver a descrição destes comandos.
Exercícios
Acrescente duas variáveis ao seu ambiente, VAR1 e VAR2, e altere o
programa de tal forma que:
1) se VAR1=true então seu programa imprime os conteúdos das variáveis de
ambiente HOME, USER, TZ e PWD;
2) se VAR2=true então seu programa imprime os conteúdos das variáveis de
ambiente PATH, LANG, PRINTER e PAPERSIZE.
Você deve buscar as strings com os nomes das variáveis para então
acessar os conteúdos das variáveis.
Dos muitos usos do valor de retorno de Main
O valor de retorno de main é usado pela shell de formas muito
úteis, que são as and-lists e as or-lists.
Primeiro, a idiossincrasia: para Bash, um retorno perfeito é denotado por
'0' (zero), que também é interpretado como o valor lógico 'true'. Qualquer
valor de retorno diferente de zero é indicativo de que algo entre o
esquisito e o errado aconteceu. Próximo do fim das páginas de manual,
sempre há uma lista com os "códigos de erro" retornados pelo programa.
Uma lista sequencial é uma sequência de programas, separados
por ';' (ponto-e-vírgula); o próximo programa da lista executa
independentemente do valor de retorno do programa anterior.
O valor de retorno do último programa que executou pode ser obtido da
variável da shell '?' (interrogação). echo $? mostra o valor de
retorno:
prompt: true ; false ; echo -e "\n retornou $?"
prompt: false ; true ; echo -e "\n retornou $?"
prompt: echo $SHELL ; echo $?
prompt: ls /bin/ls ; echo -e "\n retornou $?"
prompt: ls /bin/x ; echo -e "\n retornou $?"
Uma and-list é uma sequência de programas, separados por '&&' (dois
e-comerciais); o próximo programa da lista somente executa se o anterior
terminou retornando 'true'. Considere a lista
prog_a && prog_b && prog_c
se prog_a retornar true, então executa a lista prog_b && prog_c
se prog_b retornar true, então executa a lista prog_c
Quando um programa retorna um valor diferente de zero (false), a sequência
é interrompida.
prompt: true && true && echo -e "\n retornou $?"
Uma or-list é uma sequência de programas, separados por '||' (duas
barras verticais); o próximo programa da lista somente executa se o anterior
terminou retornando algum valor diferente de 'true'. Considere a lista
prog_x || prog_y || prog_z
se prog_x retornar false, então executa a lista prog_y && prog_z
se prog_y retornar false, então executa a lista prog_z
Quando um programa retorna um valor igual a zero (true), a sequência é
interrompida.
prompt: false || false || echo -e "\n retornou $?"
As combinações têm o comportamento óbvio, embora nem sempre intuitivo.
prompt: true && false || echo -e "\n retornou $?"
prompt: false || true && echo -e "\n retornou $?"
--fim da aula--