Curso de ShellScript - Lm01 shellscript

5
O ambiente Linux Para você entender o que é e como fun- ciona o Shell, primeiro vou te mostrar como funciona o ambiente em camadas do Linux. Dê uma olhada no gráfico mostrado na Figura 1. Neste gráfico podemos ver que a ca- mada de hardware é a mais profunda e é formada pelos componentes físicos do seu computador. Em torno dela, vem a camada do kernel que é o cerne do Linux, seu núcleo, e é quem põe o hard- ware para funcionar, fazendo seu geren- ciamento e controle. Os programas e comandos que envolvem o kernel, dele se utilizam para realizar as tarefas para que foram desenvolvidos. Fechando tudo isso vem o Shell, que leva este nome porque, em inglês, Shell significa con- cha, carapaça, isto é, fica entre o u- suário e o sistema operacional, de forma que tudo que interage com o sistema operacional, tem que passar pelo seu crivo. O ambiente Shell Bom já que para chegar ao núcleo do Linux, no seu ker- nel que é o que interessa a todo aplicativo, é necessária a filtragem do Shell, vamos enten- der como ele funciona de forma a tirar o máximo proveito das inú- meras facilidades que ele nos oferece. O Linux, por definição, é um sistema multiusuário – não podemos nunca nos esquecer disto – e para permitir o acesso de determinados usuários e barrar a en- trada de outros, existe um arquivo cha- mado /etc/passwd, que além de fornecer dados para esta função de “leão-de-chá- cara” do Linux, também provê informa- ções para o início de uma sessão (ou “login”, para os íntimos) daqueles que passaram por esta primeira barreira. O último campo de seus registros informa ao sistema qual é o Shell que a pessoa vai receber ao iniciar sua sessão. Lembra que eu te falei de Shell, fa- mília, irmão? Pois é, vamos começar a entender isto: o Shell é a conceituação de concha envolvendo o sistema opera- cional propriamente dito, é o nome genérico para tratar os filhos desta idéia que, ao longo dos muitos anos de exis- D iálogo entreouvido em uma mesa de um botequim, entre um usuário de Linux e um empur- rador de mouse: Quem é o Bash? É o filho caçula da família Shell. • Pô cara! Estás a fim de me deixar maluco? Eu tinha uma dúvida e você me deixa com duas! • Não, maluco você já é há muito tem- po: desde que decidiu usar aquele sis- tema operacional que você precisa reiniciar dez vezes por dia e ainda por cima não tem domínio nenhum sobre o que esta acontecendo no seu com- putador. Mas deixa isso prá lá, pois vou te explicar o que é Shell e os com- ponentes de sua família e ao final da nossa conversa você dirá: “Meu Deus do Shell! Porque eu não optei pelo Linux antes?”. 82 Agosto 2004 www.linuxmagazine.com.br Papo de Botequim LINUX USER Você não agüenta mais aquele seu amigo usuário de Linux enchendo o seu saco com aquela história de que o sistema é fantástico e o Shell é uma ferramenta maravilhosa? A partir desta edição vai ficar mais fácil en- tender o porquê deste entusiasmo... POR JULIO CEZAR NEVES Curso de Shell Script Papo de Botequim Bourne Shell (sh): Desenvolvido por Stephen Bourne do Bell Labs (da AT&T,onde também foi desenvolvido o Unix), foi durante muitos anos o Shell padrão do sistema operacional Unix. É também chamado de Standard Shell por ter sido durante vários anos o único, e é até hoje o mais utilizado. Foi portado para praticamente todos os ambientes Unix e dis- tribuições Linux. Korn Shell (ksh): Desenvolvido por David Korn, também do Bell Labs, é um supercon- junto do sh, isto é, possui todas as facilidades do sh e a elas agregou muitas outras. A com- patibilidade total com o sh vem trazendo muitos usuários e programadores de Shell para este ambiente. Boune Again Shell (bash): Desenvolvido ini- cialmente por Brian Fox e Chet Ramey, este é o Shell do projeto GNU. O número de seus adeptos é o que mais cresce em todo o mundo, seja por que ele é o Shell padrão do Linux, seja por sua grande diversidade de comandos, que incorpora inclusive diversos comandos característicos do C Shell. C Shell (csh): Desenvolvido por Bill Joy, da Universidade de Berkley, é o Shell mais uti- lizado em ambientes BSD. Foi ele quem intro- duziu o histórico de comandos. A estruturação de seus comandos é bem simi- lar à da linguagem C. Seu grande pecado foi ignorar a compatibilidade com o sh, partindo por um caminho próprio. Além destes Shells existem outros, mas irei falar somente sobre os três primeiros, tratan- do-os genericamente por Shell e assinalando as especificidades de cada um. Quadro 1: Uma rapidinha nos principais sabores de Shell

Transcript of Curso de ShellScript - Lm01 shellscript

Page 1: Curso de ShellScript - Lm01 shellscript

O ambiente LinuxPara você entender o que é e como fun-ciona o Shell, primeiro vou te mostrarcomo funciona o ambiente em camadasdo Linux. Dê uma olhada no gráficomostrado na Figura 1.

Neste gráfico podemos ver que a ca-mada de hardware é a mais profunda e éformada pelos componentes físicos doseu computador. Em torno dela, vem acamada do kernel que é o cerne doLinux, seu núcleo, e é quem põe o hard-ware para funcionar, fazendo seu geren-ciamento e controle. Os programas ecomandos que envolvem o kernel, delese utilizam para realizar as tarefas paraque foram desenvolvidos. Fechando tudoisso vem o Shell, que leva este nome

porque, em inglês, Shell significa con-cha, carapaça, isto é, fica entre o u-

suário e o sistema operacional, deforma que tudo que interage como sistema operacional, tem quepassar pelo seu crivo.

O ambiente ShellBom já que para chegar aonúcleo do Linux, no seu ker-nel que é o que interessa a

todo aplicativo, é necessária afiltragem do Shell, vamos enten-

der como ele funciona de forma atirar o máximo proveito das inú-

meras facilidades que ele nos oferece.O Linux, por definição, é um sistema

multiusuário – não podemos nunca nosesquecer disto – e para permitir o acessode determinados usuários e barrar a en-trada de outros, existe um arquivo cha-mado /etc/passwd, que além de fornecerdados para esta função de “leão-de-chá-cara” do Linux, também provê informa-ções para o início de uma sessão (ou“login”, para os íntimos) daqueles quepassaram por esta primeira barreira. Oúltimo campo de seus registros informaao sistema qual é o Shell que a pessoavai receber ao iniciar sua sessão.

Lembra que eu te falei de Shell, fa-mília, irmão? Pois é, vamos começar aentender isto: o Shell é a conceituaçãode concha envolvendo o sistema opera-cional propriamente dito, é o nomegenérico para tratar os filhos desta idéiaque, ao longo dos muitos anos de exis-

Diálogo entreouvido em uma mesade um botequim, entre umusuário de Linux e um empur-

rador de mouse:• Quem é o Bash?• É o filho caçula da família Shell.• Pô cara! Estás a fim de me deixar

maluco? Eu tinha uma dúvida e vocême deixa com duas!

• Não, maluco você já é há muito tem-po: desde que decidiu usar aquele sis-tema operacional que você precisareiniciar dez vezes por dia e ainda porcima não tem domínio nenhum sobreo que esta acontecendo no seu com-putador. Mas deixa isso prá lá, poisvou te explicar o que é Shell e os com-ponentes de sua família e ao final danossa conversa você dirá: “Meu Deusdo Shell! Porque eu não optei peloLinux antes?”.

82 Agosto 2004 www.linuxmagazine.com.br

Papo de BotequimLINUX USER

Você não agüenta mais aquele seu

amigo usuário de Linux enchendo o

seu saco com aquela história de que o

sistema é fantástico e o Shell é uma

ferramenta maravilhosa? A partir

desta edição vai ficar mais fácil en-

tender o porquê deste entusiasmo...

POR JULIO CEZAR NEVES

Curso de Shell Script

Papo de Botequim

Bourne Shell (sh): Desenvolvido por StephenBourne do Bell Labs (da AT&T, onde tambémfoi desenvolvido o Unix), foi durante muitosanos o Shell padrão do sistema operacionalUnix. É também chamado de Standard Shellpor ter sido durante vários anos o único, e éaté hoje o mais utilizado. Foi portado parapraticamente todos os ambientes Unix e dis-tribuições Linux.Korn Shell (ksh): Desenvolvido por DavidKorn, também do Bell Labs, é um supercon-junto do sh, isto é, possui todas as facilidades

do sh e a elas agregou muitas outras. A com-patibilidade total com o sh vem trazendomuitos usuários e programadores de Shellpara este ambiente.Boune Again Shell (bash):Desenvolvido ini-cialmente por Brian Fox e Chet Ramey, este éo Shell do projeto GNU. O número de seusadeptos é o que mais cresce em todo omundo, seja por que ele é o Shell padrão doLinux, seja por sua grande diversidade decomandos, que incorpora inclusive diversoscomandos característicos do C Shell.

C Shell (csh): Desenvolvido por Bill Joy, daUniversidade de Berkley, é o Shell mais uti-lizado em ambientes BSD. Foi ele quem intro-duziu o histórico de comandos. Aestruturação de seus comandos é bem simi-lar à da linguagem C. Seu grande pecado foiignorar a compatibilidade com o sh, partindopor um caminho próprio.Além destes Shells existem outros, mas ireifalar somente sobre os três primeiros, tratan-do-os genericamente por Shell e assinalandoas especificidades de cada um.

Quadro 1: Uma rapidinha nos principais sabores de Shell

Page 2: Curso de ShellScript - Lm01 shellscript

tência do sistema operacional Unix,foram aparecendo. Atualmente existemdiversos sabores de Shell (veja Quadro 1na página anterior).

Como funciona o ShellO Shell é o primeiro programa que vocêganha ao iniciar sua sessão (se quiser-mos assassinar a língua portuguesapodemos também dizer “ao se logar”) noLinux. É ele quem vai resolver um montede coisas de forma a não onerar o kernelcom tarefas repetitivas, poupando-o paratratar assuntos mais nobres. Como cadausuário possui o seu próprio Shell inter-pondo-se entre ele e o Linux, é o Shellquem interpreta os comandos digitados eexamina as suas sintaxes, passando-osesmiuçados para execução.• Êpa! Esse negócio de interpretar co-

mando não tem nada a ver com inter-pretador não, né?

• Tem sim: na verdade o Shell é um in-terpretador que traz consigo uma po-derosa linguagem com comandos dealto nível, que permite construção deloops, de tomadas de decisão e de ar-mazenamento de valores em variáveis,como vou te mostrar.

• Vou explicar as principais tarefas que oShell cumpre, na sua ordem de exe-cução. Preste atenção, porque estaordem é fundamental para o entendi-mento do resto do nosso bate papo.

Análise da linha de comandoNeste exame o Shell identifica os carac-teres especiais (reservados) que têm sig-nificado para a interpretação da linha elogo em seguida verifica se a linha pas-sada é um comando ou uma atribuiçãode valores, que são os ítens que voudescrever a seguir.

ComandoQuando um comando é digi-tado no “prompt” (ou linha decomando) do Linux, ele é divi-dido em partes, separadas porespaços em branco: a primeiraparte é o nome do programa,cuja existência será verificada;em seguida, nesta ordem, vêmas opções/parâmetros, redire-cionamentos e variáveis.

Quando o programa identifi-cado existe, o Shell verifica aspermissões dos arquivos en-

volvidos (inclusive o próprio programa),e retorna um erro caso o usuário quechamou o programa não esteja autor-izado a executar esta tarefa.

$ ls linuxlinux

Neste exemplo o Shell identificou o ls co-mo um programa e o linux como um pa-râmetro passado para o programa ls.

AtribuiçãoSe o Shell encontra dois campos separa-dos por um sinal de igual (=) sem espa-ços em branco entre eles, ele identificaesta seqüência como uma atribuição.

$ valor=1000

Neste caso, por não haver espaços embranco (que é um dos caracteres reserva-dos), o Shell identificou uma atribuição ecolocou 1000 na variável valor.

Resolução deRedirecionamentosApós identificar os componentes da li-nha que você digitou, o Shell parte paraa resolução de redirecionamentos.

O Shell tem incorporado ao seu elencode habilidades o que chamamos de

redirecionamento, que pode ser deentrada (stdin), de saída (stdout) ou doserros (stderr), conforme vou explicar aseguir. Mas antes precisamos falar de...

Substituição de VariáveisNeste ponto, o Shell verifica se as even-tuais variáveis (parâmetros começadospor $), encontradas no escopo docomando, estão definidas e as substituipor seus valores atuais.

Substituição de Meta-CaracteresSe algum meta-caracter (ou “coringa”,como *, ? ou []) for encontrado na linhade comando, ele será substituído porseus possíveis valores.

Supondo que o único item no seudiretório corrente cujo nome começacom a letra n seja um diretório chamadonomegrandeprachuchu, se você fizer:

$ cd n*

como até aqui quem está manipulando alinha de comando ainda é o Shell e oprograma cd ainda não foi executado, oShell expande o n* para nomegrandepra-chuchu (a única possibilidade válida) eexecuta o comando cd com sucesso.

Entrega da linha de comandopara o kernelCompletadas todas as tarefas anteriores,o Shell monta a linha de comando, jácom todas as substituições feitas echama o kernel para executá-la em umnovo Shell (Shell filho), que ganha umnúmero de processo (PID ou ProcessIDentification) e fica inativo, tirandouma soneca durante a execução do pro-grama. Uma vez encerrado este processo(e o Shell filho), o “Shell pai” recebenovamente o controle e exibe um“prompt”, mostrando que está prontopara executar outros comandos.

83www.linuxmagazine.com.br Agosto 2004

LINUX USERPapo de Botequim

Figura 1: Ambiente em camadas de um sistema Linux

ShellProgramas e Comandos

Núcleo ou KernelHardware

Quando digo que o último campo do arqui-vo /etc/passwd informa ao sistema qual é oShell que o usuário vai usar ao se “logar”, istodeve ser interpretado ao pé-da-letra. Se estecampo do seu registro contém o termo prog,ao acessar o sistema o usuário executará oprograma prog. Ao término da execução, asessão do usuário se encerra automatica-mente. Imagine quanto se pode incremen-tar a segurança com este simples artifício.

Com que Shell eu vou?

Jamais faça:

$ valor = 1000bash: valor: not foundNeste caso, o Bash achou a palavra valor iso-lada por espaços e julgou que você estivessemandando executar um programa chama-do valor, para o qual estaria passando doisparâmetros: = e 1000.

Cuidado na Atribuição

Page 3: Curso de ShellScript - Lm01 shellscript

$ echo \*$ echo *

Viu a diferença?• Aspas (“): exatamente iguais ao após-

trofo, exceto que, se a cadeia entreaspas contiver um cifrão ($), umacrase (`), ou uma barra invertida (\),estes caracteres serão interpretadospelo Shell.Não precisa se estressar, eu não te deiexemplos do uso das aspas por quevocê ainda não conhece o cifrão ($)nem a crase (`). Daqui para frente -veremos com muita constância o usodestes caracteres especiais; o maisimportante é entender seu significado.

Caracteres deredirecionamentoA maioria dos comandos tem uma entra-da, uma saída e pode gerar erros. Estaentrada é chamada Entrada Padrão oustdin e seu dispositivo padrão é o tecladodo terminal. Analogamente, a saída docomando é chamada Saída Padrão oustdout e seu dispositivo padrão é a telado terminal. Para a tela também sãoenviadas normalmente as mensagens deerro oriundas dos comandos, chamadaneste caso de Saída de Erro Padrão oustderr. Veremos agora como alterar esteestado de coisas.

Vamos fazer um programa gago. Paraisto digite (tecle “Enter” ao final de cadalinha – comandos do usuário são ilus-trados em negrito):

$ catE-e-eu sou gago. Vai encarar?E-e-eu sou gago. Vai encarar?

O cat é um comando que lista o con-teúdo do arquivo especificado para aSaída Padrão (stdout). Caso a entradanão seja definida, ele espera os dados dastdin (a entrada padrão). Ora como eunão especifiquei a entrada, ele a está

esperando pelo teclado (Entrada Padrão)e como também não citei a saída, o queeu teclar irá para a tela (Saída Padrão),criando desta forma – como eu haviaproposto – um programa gago. Experi-mente!

Redirecionamentop da SaídaPadrãoPara especificarmos a saída de um pro-grama usamos o símbolo “>” ou o“>>”, seguido do nome do arquivo pa-ra o qual se deseja mandar a saída.

Vamos transformar o programa ante-rior em um “editor de textos”:

$ cat > Arq

O cat continua sem ter a entrada especi-ficada, portanto está aguardando que osdados sejam teclados, porém a sua saídaestá sendo desviada para o arquivo Arq.Assim sendo, tudo que esta sendo tecla-do esta indo para dentro de Arq, de for-ma que fizemos o editor de textos maiscurto e ruim do planeta.

Se eu fizer novamente:

$ cat > Arq

Os dados contidos em Arq serão perdi-dos, já que antes do redirecionamento oShell criará um Arq vazio. Para colocarmais informações no final do arquivo eudeveria ter feito:

$ cat >> Arq

Redirecionamento da Saídade Erro PadrãoAssim como por padrão o Shell recebe osdados do teclado e envia a saída para atela, os erros também vão para a tela sevocê não especificar para onde eles de-vem ser enviados. Para redirecionar oserros, use 2> SaidaDeErro. Note que en-tre o número 2 e o sinal de maior (>)não existe espaço em branco.

Vamos supor que durante a execuçãode um script você pode, ou não (depen-dendo do rumo tomado pela execuçãodo programa), ter criado um arquivochamado /tmp/seraqueexiste$$. Comonão quer ficar com sujeira no discorígido, ao final do script você coloca alinha a seguir:

rm /tmp/seraqueexiste$$

Decifrando a Pedra de RosetaPara tirar aquela sensação que você temquando vê um script Shell, que maisparece uma sopa de letrinhas ou um con-junto de hieróglifos, vou lhe mostrar osprincipais caracteres especiais para quevocê saia por aí como Champollion deci-frando a Pedra de Roseta.

Caracteres para remoção dosignificado.É isso mesmo, quando não desejamosque o Shell interprete um caractereespecífico, devemos “escondê-lo” dele.Isso pode ser feito de três maneiras difer-entes, cada uma com sua peculiaridade:• Apóstrofo (´): quando o Shell vê uma

cadeia de caracteres entre apóstrofos,ele retira os apóstrofos da cadeia e nãointerpreta seu conteúdo.

$ ls linuxm*linuxmagazine$ ls 'linuxm*'bash: linuxm* no such file U

or directory

No primeiro caso o Shell “expandiu” oasterisco e descobriu o arquivo linux-magazine para listar. No segundo, osapóstrofos inibiram a interpretação doShell e veio a resposta que não existe oarquivo linuxm*.

• Contrabarra ou Barra Invertida (\): i-dêntico aos apóstrofos exceto que abarra invertida inibe a interpretaçãosomente do caractere que a segue.Suponha que você, acidentalmente,tenha criado um arquivo chamado *(asterisco) – o que alguns sabores deUnix permitem – e deseja removê-lo.Se você fizesse:

$ rm *

Você estaria na maior encrenca, pois orm removeria todos os arquivos dodiretório corrente. A melhor forma defazer o serviço é:

$ rm \*

Desta forma, o Shell não interpreta oasterisco, evitando a sua expansão.Faça a seguinte experiência científica:

$ cd /etc$ echo '*'

84 Agosto 2004 www.linuxmagazine.com.br

Papo de BotequimLINUX USER

Como já havia dito, o Shell resolve a linha edepois manda o comando para a execução.Assim, se você redirecionar a saída de umarquivo para ele próprio, primeiramente oShell “esvazia”este arquivo e depois mandao comando para execução! Desta forma,para sua alegria, você acabou de perder oconteúdo de seu querido arquivo.

Redirecionamento Perigoso

Page 4: Curso de ShellScript - Lm01 shellscript

Caso o arquivo não existisse seria envi-ado para a tela uma mensagem de erro.Para que isso não aconteça faça:

rm /tmp/seraqueexiste$$ 2> U

/dev/null

Para que você teste a Saída de Erro Pa-drão direto no prompt do seu Shell, voudar mais um exemplo. Faça:

$ ls naoexistebash: naoexiste no such file U

or directory$ ls naoexiste 2> arquivodeerros$$ cat arquivodeerrosbash: naoexiste no such file U

or directory

Neste exemplo, vimos que quando fize-mos um ls em naoexiste, ganhamos umamensagem de erro. Após redirecionar aSaída de Erro Padrão para arquivodeerrose executar o mesmo comando, recebe-mos somente o “prompt” na tela. Quan-do listamos o conteúdo do arquivo parao qual foi redirecionada a Saída de ErroPadrão, vimos que a mensagem de errotinha sido armazenada nele.

É interessante notar que estes carac-teres de redirecionamento são cumula-tivos, isto é, se no exemplo anteriorfizéssemos o seguinte:

$ ls naoexiste 2>> U

arquivodeerros

a mensagem de erro oriunda do ls seriaanexada ao final de arquivodeerros.

Redirecionamento daEntrada PadrãoPara fazermos o redirecionamento da En-trada Padrão usamos o < (menor que).“E pra que serve isso?”, você vai me per-guntar. Deixa eu dar um exemplo, quevocê vai entender rapidinho.

Suponha que você queira mandar ummail para o seu chefe. Para o chefe nós

caprichamos, né? Então ao invés de sairredigindo o mail direto no “prompt”, deforma a tornar impossível a correção deuma frase anterior onde, sem querer,você escreveu um “nós vai”, você editaum arquivo com o conteúdo da mensa-gem e após umas quinze verificaçõessem constatar nenhum erro, decideenviá-lo e para tal faz:

$ mail [email protected] < UU

arquivocommailparaochefe

e o chefe receberá uma mensagem com oconteúdo do arquivocommailparaochefe.

Outro tipo de redirecionamento “muitolouco” que o Shell permite é o chamado“here document”. Ele é representado por<< e serve para indicar ao Shell que oescopo de um comando começa na linhaseguinte e termina quando encontra umalinha cujo conteúdo seja unicamente o“label” que segue o sinal <<.

Veja o fragmento de script a seguir,com uma rotina de ftp:

ftp -ivn hostremoto << fimftpuser $Usuario $Senhabinaryget arquivoremotofimftp

neste pedacinho de programa temos ummonte de detalhes interessantes:• As opções usadas para o ftp (-ivn)

servem para ele listar tudo que estáacontecendo (opção -v de “verbose”),para não ficar perguntando se vocêtem certeza que deseja transmitir cadaarquivo (opção -i de “interactive”) efinalmente a opção -n serve para dizerao ftp para ele não solicitar o usuário esua senha, pois estes serão informadospela instrução específica (user);

• Quando eu usei o << fimftp, estavadizendo o seguinte para o interpreta-dor: “Olha aqui Shell, não se meta em

nada a partir deste ponto até encontraro ‘label’ fimftp. Você não entenderiadroga nenhuma, já que são instruçõesespecíficas do ftp”.

Se fosse só isso seria simples, maspelo próprio exemplo dá para ver queexistem duas variáveis ($Usuario e$Senha), que o Shell vai resolver antesdo redirecionamento. Mas a grandevantagem deste tipo de construção éque ela permite que comandos tam-bém sejam interpretados dentro doescopo do “here document”, o que,aliás, contraria o que acabei de dizer.Logo a seguir te explico como essenegócio funciona. Agora ainda não dá,estão faltando ferramentas.

• O comando user é do repertório deinstruções do ftp e serve para passar ousuário e a senha que haviam sidolidos em uma rotina anterior a estefragmento de código e colocados res-pectivamente nas duas variáveis:$Usuario e $Senha.

• O binary é outra instrução do ftp, queserve para indicar que a transferênciade arquivoremoto será feita em modobinário, isto é o conteúdo do arquivonão será inteerpretado para saber seestá em ASCII, EBCDIC, …

• O comando get arquivoremoto diz aocliente ftp para pegar este arquivo noservidor hostremoto e trazê-lo para anossa máquina local. Se quiséssemosenviar um arquivo, bastaria usar, porexemplo, o comando put arquivolocal.

Redirecionamento decomandosOs redirecionamentos de que falamos atéagora sempre se referiam a arquivos, istoé, mandavam para arquivo, recebiam dearquivo, simulavam arquivo local, … Oque veremos a partir de agora, redirecio-na a saída de um comando para a entra-da de outro. É utilíssimo e, apesar de nãoser macaco gordo, sempre quebra os

85www.linuxmagazine.com.br Agosto 2004

LINUX USERPapo de Botequim

Preste atenção! Não confunda >> com 2>. Oprimeiro anexa dados ao final de um arqui-vo, e o segundo redireciona a Saída de ErroPadrão (stderr) para um arquivo que estásendo designado. Isto é importante!

Dados ou Erros?

O $$ contém o PID, isto é,o número do seuprocesso.Como o Linux é multiusuário,ébom anexar sempre o $$ ao nome dos seusarquivos para não haver problema de propri-edade, isto é,caso você batizasse o seu ar-quivo simplesmente como seraqueexiste,aprimeira pessoa que o usasse (criando-oentão) seria o seu dono e a segunda ganhariaum erro quando tentasse gravar algo nele.

Direito de Posse

Um erro comum no uso de labels (como ofimftp do exemplo anterior) é causado pelapresença de espaços em branco antes ouapós o mesmo. Fique muito atento quanto aisso, por que este tipo de erro costuma daruma boa surra no programador, até que sejadetectado. Lembre-se: um label que se prezetem que ter uma linha inteira só para ele.

Etiquetas Erradas

Page 5: Curso de ShellScript - Lm01 shellscript

$ echo "Existem who | wc -l UU

usuarios conectados"Existem who | wc -l usuarios U

conectados

Hi! Olha só, não funcionou! É mesmo,não funcionou e não foi por causa dasaspas que eu coloquei, mas sim por queeu teria que ter executado o who | wc -lantes do echo. Para resolver este proble-ma, tenho que priorizar a segunda partedo comando com o uso de crases:

$ echo "Existem `who | wc -l` UU

usuarios conectados"Existem 8 usuarios U

conectados

Para eliminar esse monte de brancosantes do 8 que o wc -l produziu, bastaretirar as aspas. Assim:

$ echo Existem `who | wc -l` UU

usuarios conectadosExistem 8 usuarios conectados

As aspas protegem da interpretação doShell tudo que está dentro dos seus lim-ites. Como para o Shell basta um espaçoem branco como separador, o monte deespaços será trocado por um único apósa retirada das aspas.

Outra coisa interessante é o uso doponto-e-vírgula. Quando estiver no Shell,você deve sempre dar um comando emcada linha. Para agrupar comandos emuma mesma linha, temos que separá-lospor ponto-e-vírgula. Então:

$ pwd ; cd /etc; pwd ;cd -;pwd/home/meudir/etc/home/meudir

Neste exemplo, listei o nome do diretóriocorrente com o comando pwd, mudeipara o diretório /etc, novamente listei onome do diretório e finalmente voltei pa-ra o diretório onde estava anteriormente(cd -), listando seu nome. Repare quecoloquei o ponto-e-vírgula de todas asformas possíveis, para mostrar que nãoimporta se existem espaços em brancoantes ou após este caracter.

Finalmente, vamos ver o caso dosparênteses. No exemplo a seguir, colo-camos diversos comandos separados porponto-e-vírgula entre parênteses:

$ (pwd ; cd /etc ; pwd)/home/meudir/etc$ pwd/home/meudir

“Quequeiiisso” minha gente? Eu estavano /home/meudir, mudei para o /etc,constatei que estava neste diretório como pwd seguinte e quando o agrupamentode comandos terminou, eu vi que conti-nuava no /etc/meudir!

Hi! Será que tem coisa do mágicoMandrake por aí? Nada disso. O interes-sante do uso de parênteses é que elesinvocam um novo Shell para executar oscomandos que estão em seu interior.Desta forma, fomos realmente para odiretório /etc, porém após a execução detodos os comandos, o novo Shell queestava no diretório /etc morreu e retor-namos ao Shell anterior que estava em/home/meudir.

Que tal usar nossos novos conceitos?

$ mail [email protected] << FIMOla suporte, hoje as `date UU“+%hh:mm”` ocorreu novamente UUaquele problema que eu havia UUreportado por telefone. De UUacordo com seu pedido segue a UUlistagem do diretorio:`ls -l`Abracos a todos.FIM

Finalmente agora podemos demonstrar oque conversamos anteriormente sobre“here document”. Os comandos entrecrases tem prioridade, portanto o Shellos executará antes do redirecionamentodo “here document”. Quando o suportereceber a mensagem, verá que oscomandos date e ls foram executadosantes do comando mail, recebendo entãoum instantâneo do ambiente nomomento de envio do email.- Garçom, passa a régua! ■

maiores galhos. Seu nome é “pipe” (queem inglês significa tubo, já que ele cana-liza a saída de um comando para aentrada de outro) e sua representação é a| (barra vertical).

$ ls | wc -l21

O comando ls passou a lista de arquivospara o comando wc, que quando estácom a opção -l conta a quantidade de li-nhas que recebeu. Desta forma, pode-mos afirmar categoricamente que nomeu diretório existiam 21 arquivos.

$ cat /etc/passwd | sort | lp

A linha de comandos acima manda alistagem do arquivo /etc/passwd para aentrada do comando sort. Este a classi-fica e envia para o lp que é o gerenciadorda fila de impressão.

Caracteres de ambienteQuando queremos priorizar uma expres-são, nós a colocamos entre parênteses,não é? Pois é, por causa da aritmética énormal pensarmos deste jeito. Mas emShell o que prioriza mesmo são as crases(`) e não os parênteses. Vou dar exemp-los para você entender melhor.

Eu quero saber quantos usuários estão“logados” no computador que eu admi-nistro. Eu posso fazer:

$ who | wc -l8

O comando who passa a lista de usuáriosconectados ao sistema para o comandowc -l, que conta quantas linhas recebeu emostra a resposta na tela. Muito bem,mas ao invés de ter um número oitosolto na tela, o que eu quero mesmo éque ele esteja no meio de uma frase. Ora,para mandar frases para a tela eu só pre-ciso usar o comando echo; então vamosver como é que fica:

86 Agosto 2004 www.linuxmagazine.com.br

Papo de BotequimLINUX USER

Julio Cezar Neves é Analista de Su-porte de Sistemas desde 1969 e tra-balha com Unix desde 1980, quandofez parte da equipe que desenvolveuo SOX, sistema operacional, similarao Unix, da Cobra Computadores. Éprofessor do curso de Mestrado emSoftware Livre das Faculdades Estáciode Sá, no Rio de Janeiro.SO

BRE

OAU

TOR

Em Unix existe um arquivo fantasma.Chama-se /dev/null.Tudo que é enviadopara este arquivo some. Assemelha-se a umBuraco Negro. No caso do exemplo, comonão me interessava guardar a possível men-sagem de erro oriunda do comando rm, redi-recionei-a para este arquivo.

Buraco Negro