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