:TITLE: Argumentos da linha de comando e strings de ambiente
;#
;# RCSID: $Header: /home/clif/CVS_ROOT/TclTutor/Tcl38.lsn,v 1.6 2000/04/24 16:17:52 clif Exp $
;# Copyright (c) 1995 Clif Flynt
;# 9300 Fleming Rd.
;# Dexter, MI  48130
;# clif@cflynt.com
;# Veja o arquivo "AVISO" com os termos da licença.
;#
;#*********************************************************
;# Portuguese translation: Lucio Agostinho Rocha
;# E-mail: outrosdiasvirao@yahoo.com.br
;# Last update: 17/01/2006
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:

O número de argumentos da linha de comando para um script Tcl é
passado com a variável global <B>argc</B>. O nome de um script
Tcl é passado para o script com a variável global <B>argv0</B>, 
e o restante dos argumentos de comando de linha são passados
como uma lista em <B>argv</B>. 
<P>
Sob sistemas operacionais compatíveis com o padrão Posix,
variáveis de ambiente são passadas em um vetor associativo global
<B>env</B>. O índice em <B>env</B> é o nome da variável de
ambiente. O comando <CODE>puts "$env(PATH)"</CODE> deveria
exibir o conteúdo da variável de ambiente <B>PATH</B>.
:TEXT_END:

:LESSON_TEXT_START_LEVEL 1:
Scripts são muito mais úteis se eles podem ser chamados com diferentes
valores na linha de comando.
<P>
Por exemplo, um script que extrai um valor particular de um arquivo
poderia ser escrito para que ele perguntasse pelo nome do arquivo,
lesse o nome do arquivo, e então extraisse os dados. Ou, ele poderia
ser escrito para executar um laço com os arquivos que estão na linha
de comando, e extrair os dados de cada arquivo, e exibir o nome do
arquivo e dados dele.
<P>
O segundo método de escrever o programa pode facilmente ser usado
a partir de outros scripts. Isso o torna mais útil.
<P>
O número de argumentos de comando de linha para um script Tcl é
passado com a variável global <B>argc</B>. O nome de um script
Tcl é passado para o script com a variável global <B>argv0</B>, 
e o restante dos argumentos de comando de linha são passados
como uma lista em <B>argv</B>. 
<P>
Outro método de passagem de informação para um script é com
<B>variáveis de ambiente</B>. Por exemplo, suponha que você está
tentando escrever um programa no qual o usuário fornece algum
tipo de comentário para encontrar um registro. O programa poderia
amigavelmente permitir que o usuário edite seus comentários em
seu editor favorito. Se o usuário definiu uma variável de ambiente
<B>EDITOR</B>, então você pode chamar aquele editor para ele utilizar.
<P>
Sob sistemas operacionais compatíveis com o padrão Posix,
variáveis de ambiente são passadas em um vetor associativo global
<B>env</B>. O índice em <B>env</B> é o nome da variável de
ambiente. O comando <CODE>puts "$env(PATH)"</CODE> deveria
exibir o conteúdo da variável de ambiente <B>PATH</B>.

:TEXT_END:

:LESSON_TEXT_START_LEVEL 2:
Há muitas forma de adquirir informação de um usuário dentro de um
script Tcl. Por exemplo, o script poderia:
<OL>
<LI> consultar o usuário por uma informação requerida;
<LI> ler a entrada de um arquivo de configuração;
<LI> ler a informação da linha de comando;
<LI> ler a informação de uma variável de ambiente.
</UL>
<P>
Nós já discutimos os métodos 1 e 2. Nesta lição, nós iremos
discutir os métodos 3 e 4.
<P>
Quando um programa é chamado de uma linha de comando, ele é chamado
com uma string de uma ou mais palavras. Na maioria dos sistemas
operacionais, a primeira palavra é o nome do programa, e as outras
palavras são referidas como os argumentos para o programa. Esses
argumentos podem ser um nome de arquivo, (como em
<B>cat /etc/passwd</B>) ou uma <I>flag</I> (como em <B>grep -i foo bar</B>), ou
um comando para o programa executar (como em <B>sed 's/one/two/g'</B>).
A interpretação dessas palavras é deixada para o programa que está
sendo chamado.
<P>
Você pode adquirir o número de argumentos da linha de comando
com a variável global <B>argc</B>. Os argumentos da linha de
comando são passados como uma lista em <B>argv</B>.  
<P>
Um programa pode até mesmo modificar seu comportamento baseado
no nome como ele é chamado. Algumas vezes, dois programas têm a
maioria do seu código em comum, e apenas umas poucas diferenças de
código. Neste caso, algumas vezes é mais simples usar um único
programa e <I>linkar</I> uma cópia dele em dois arquivos com
dois nomes diferentes (ou usar o comando unix <CODE>ln</CODE> para
<I>linkar</I> um arquivo a outro, com outro nome). Quando esse script
executa, ele veria como ele foi chamado, e pode então escolher um conjunto
de código particular para executar dependendo de como foi chamado.
<P>
O nome de um script Tcl é passado para o script com a variável
global <B>argv0</B>.
<P>
Há também certas partes de informação que um usuário de computador pode
querer
atribuir uma vez, e deixar qualquer programa que precise conhecer
essa informação encontrá-la. Essas partes de informação são manipuladas 
com <B>variáveis de ambiente</B> e são comumente atribuídas nos
seus arquivos .profile ou .login (em sistemas Unix, por exemplo). Por
exemplo, a maioria das pessoas têm seu editor de texto favorito indicado
na variável de ambiente <B>EDITOR</B>. Programas que deixam o usuário editar um
arquivo podem checar essa variável para ver qual editor deve ser chamado.
<P>
Em Tcl, essas variáveis de ambiente são passadas para um script em
um vetor associativo chamado <B>env</B>. O índice em <B>env</B> é
o nome da variável de ambiente que seu script está checando. Para
indicar um editor para ser chamado, você poderia escrever um
código como esse:
<CODE>
set editor "vi"
if {[info exists env(EDITOR)]} {set editor $env(EDITOR)}
</CODE>
<P>
Agora, execute o exemplo, e veja a saída. Neste caso, 
não há argumentos para o script, então <B>argc</B> é 0. 
:TEXT_END:

:CODE_START:
puts "Há $argc argumento(s) para este script"
puts "O nome do script é $argv0"
if {$argc > 0} {puts "Os outros argumentos são: $argv" }

puts "Você tem essas variáveis de ambiente atribuídas:"
foreach indice [array names env] {
  puts "$indice: $env($indice)"
}
:TEXT_END:

