ciona o Shell, primeiro vou te mostrar como funciona o ambiente em camadas do Linux. D uma olhada no grfico mostrado na Figura 1. Neste grfico podemos ver que a ca- mada de hardware a mais profunda e formada pelos componentes fsicos do seu computador. Em torno dela, vem a camada do kernel que o cerne do Linux, seu ncleo, e quem pe 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 ingls, Shell significa con- cha, carapaa, isto , fica entre o u- surio 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 ncleo do Linux, no seu ker- nel que o que interessa a todo aplicativo, necessria a filtragem do Shell, vamos enten- der como ele funciona de forma a tirar o mximo proveito das in- meras facilidades que ele nos oferece. O Linux, por definio, um sistema multiusurio no podemos nunca nos esquecer disto e para permitir o acesso de determinados usurios e barrar a en- trada de outros, existe um arquivo cha- mado /etc/passwd, que alm de fornecer dados para esta funo de leo-de-ch- cara do Linux, tambm prov informa- es para o incio de uma sesso (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 sesso. Lembra que eu te falei de Shell, fa- mlia, irmo? Pois , vamos comear a entender isto: o Shell a conceituao de concha envolvendo o sistema opera- cional propriamente dito, o nome genrico para tratar os filhos desta idia que, ao longo dos muitos anos de exis- D ilogo entreouvido em uma mesa de um botequim, entre um usurio de Linux e um empur- rador de mouse: Quem o Bash? o filho caula da famlia Shell. P cara! Ests a fim de me deixar maluco? Eu tinha uma dvida e voc me deixa com duas! No, 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 no tem domnio 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 famlia e ao final da nossa conversa voc dir: Meu Deus do Shell! Porque eu no optei pelo Linux antes?. 82 Agosto 2004 www.linuxmagazine.com.br Papo de Botequim LI NUX USER Voc no agenta mais aquele seu amigo usurio de Linux enchendo o seu saco com aquela histria de que o sistema fantstico e o Shell uma ferramenta maravilhosa? A partir desta edio vai ficar mais fcil 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 tambm foi desenvolvido o Unix), foi durante muitos anos o Shell padro do sistema operacional Unix. tambm chamado de Standard Shell por ter sido durante vrios anos o nico, e at hoje o mais utilizado. Foi portado para praticamente todos os ambientes Unix e dis- tribuies Linux. Korn Shell (ksh): Desenvolvido por David Korn, tambm 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 usurios 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 nmero de seus adeptos o que mais cresce em todo o mundo, seja por que ele o Shell padro do Linux, seja por sua grande diversidade de comandos, que incorpora inclusive diversos comandos caractersticos 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 histrico de comandos. A estruturao de seus comandos bem simi- lar da linguagem C. Seu grande pecado foi ignorar a compatibilidade com o sh, partindo por um caminho prprio. Alm destes Shells existem outros, mas irei falar somente sobre os trs primeiros, tratan- do-os genericamente por Shell e assinalando as especificidades de cada um. Quadro 1: Uma rapidinha nos principais sabores de Shell tncia do sistema operacional Unix, foram aparecendo. Atualmente existem diversos sabores de Shell (veja Quadro 1 na pgina anterior). Como funciona o Shell O Shell o primeiro programa que voc ganha ao iniciar sua sesso (se quiser- mos assassinar a lngua portuguesa podemos tambm dizer ao se logar) no Linux. ele quem vai resolver um monte de coisas de forma a no onerar o kernel com tarefas repetitivas, poupando-o para tratar assuntos mais nobres. Como cada usurio possui o seu prprio Shell inter- pondo-se entre ele e o Linux, o Shell quem interpreta os comandos digitados e examina as suas sintaxes, passando-os esmiuados para execuo. pa! Esse negcio de interpretar co- mando no tem nada a ver com inter- pretador no, n? Tem sim: na verdade o Shell um in- terpretador que traz consigo uma po- derosa linguagem com comandos de alto nvel, que permite construo de loops, de tomadas de deciso e de ar- mazenamento de valores em variveis, como vou te mostrar. Vou explicar as principais tarefas que o Shell cumpre, na sua ordem de exe- cuo. Preste ateno, porque esta ordem fundamental para o entendi- mento do resto do nosso bate papo. Anlise da linha de comando Neste exame o Shell identifica os carac- teres especiais (reservados) que tm sig- nificado para a interpretao da linha e logo em seguida verifica se a linha pas- sada um comando ou uma atribuio de valores, que so os tens que vou descrever a seguir. Comando Quando um comando digi- tado no prompt (ou linha de comando) do Linux, ele divi- dido em partes, separadas por espaos em branco: a primeira parte o nome do programa, cuja existncia ser verificada; em seguida, nesta ordem, vm as opes/parmetros, redire- cionamentos e variveis. Quando o programa identifi- cado existe, o Shell verifica as permisses dos arquivos en- volvidos (inclusive o prprio programa), e retorna um erro caso o usurio que chamou o programa no esteja autor- izado a executar esta tarefa. $ ls linux linux Neste exemplo o Shell identificou o ls co- mo um programa e o linux como um pa- rmetro passado para o programa ls. Atribuio Se o Shell encontra dois campos separa- dos por um sinal de igual (=) sem espa- os em branco entre eles, ele identifica esta seqncia como uma atribuio. $ valor=1000 Neste caso, por no haver espaos em branco (que um dos caracteres reserva- dos), o Shell identificou uma atribuio e colocou 1000 na varivel valor. Resoluo de Redirecionamentos Aps identificar os componentes da li- nha que voc digitou, o Shell parte para a resoluo de redirecionamentos. O Shell tem incorporado ao seu elenco de habilidades o que chamamos de redirecionamento, que pode ser de entrada (stdin), de sada (stdout) ou dos erros (stderr), conforme vou explicar a seguir. Mas antes precisamos falar de... Substituio de Variveis Neste ponto, o Shell verifica se as even- tuais variveis (parmetros comeados por $), encontradas no escopo do comando, esto definidas e as substitui por seus valores atuais. Substituio de Meta- Caracteres Se algum meta-caracter (ou coringa, como *, ? ou []) for encontrado na linha de comando, ele ser substitudo por seus possveis valores. Supondo que o nico item no seu diretrio corrente cujo nome comea com a letra n seja um diretrio chamado nomegrandeprachuchu, se voc fizer: $ cd n* como at aqui quem est manipulando a linha de comando ainda o Shell e o programa cd ainda no foi executado, o Shell expande o n* para nomegrandepra- chuchu (a nica possibilidade vlida) e executa o comando cd com sucesso. Entrega da linha de comando para o kernel Completadas todas as tarefas anteriores, o Shell monta a linha de comando, j com todas as substituies feitas e chama o kernel para execut-la em um novo Shell (Shell filho), que ganha um nmero de processo (PID ou Process IDentification) e fica inativo, tirando uma soneca durante a execuo do pro- grama. Uma vez encerrado este processo (e o Shell filho), o Shell pai recebe novamente o controle e exibe um prompt, mostrando que est pronto para executar outros comandos. 83 www.linuxmagazine.com.br Agosto 2004 LI NUX USER Papo de Botequim Figura 1: Ambiente em camadas de um sistema Linux Shell Programas e Comandos Ncleo ou Kernel Hardware Quando digo que o ltimo campo do arqui- vo /etc/passwdinforma ao sistema qual o Shell que o usurio vai usar ao se logar, isto deve ser interpretado ao p-da-letra. Se este campo do seu registro contm o termo prog, ao acessar o sistema o usurio executar o programa prog. Ao trmino da execuo, a sesso do usurio se encerra automatica- mente. Imagine quanto se pode incremen- tar a segurana com este simples artifcio. Com que Shell eu vou? Jamais faa: $ valor = 1000 bash: valor: not found Neste caso, o Bash achou a palavra valor iso- lada por espaos e julgou que voc estivesse mandando executar um programa chama- do valor, para o qual estaria passando dois parmetros: =e 1000. Cuidado na Atribuio $ echo \* $ echo * Viu a diferena? Aspas (): exatamente iguais ao aps- trofo, exceto que, se a cadeia entre aspas contiver um cifro ($), uma crase (`), ou uma barra invertida (\), estes caracteres sero interpretados pelo Shell. No precisa se estressar, eu no te dei exemplos do uso das aspas por que voc ainda no conhece o cifro ($) nem a crase (`). Daqui para frente - veremos com muita constncia o uso destes caracteres especiais; o mais importante entender seu significado. Caracteres de redirecionamento A maioria dos comandos tem uma entra- da, uma sada e pode gerar erros. Esta entrada chamada Entrada Padro ou stdin e seu dispositivo padro o teclado do terminal. Analogamente, a sada do comando chamada Sada Padro ou stdout e seu dispositivo padro a tela do terminal. Para a tela tambm so enviadas normalmente as mensagens de erro oriundas dos comandos, chamada neste caso de Sada de Erro Padro ou stderr. Veremos agora como alterar este estado de coisas. Vamos fazer um programa gago. Para isto digite (tecle Enter ao final de cada linha comandos do usurio so ilus- trados em negrito): $ cat E-e-eu sou gago. Vai encarar? E-e-eu sou gago. Vai encarar? O cat um comando que lista o con- tedo do arquivo especificado para a Sada Padro (stdout). Caso a entrada no seja definida, ele espera os dados da stdin (a entrada padro). Ora como eu no especifiquei a entrada, ele a est esperando pelo teclado (Entrada Padro) e como tambm no citei a sada, o que eu teclar ir para a tela (Sada Padro), criando desta forma como eu havia proposto um programa gago. Experi- mente! Redirecionamentop da Sada Padro Para especificarmos a sada de um pro- grama usamos o smbolo > ou o >>, seguido do nome do arquivo pa- ra o qual se deseja mandar a sada. 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 os dados sejam teclados, porm a sua sada est 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 mais curto e ruim do planeta. Se eu fizer novamente: $ cat > Arq Os dados contidos em Arq sero perdi- dos, j que antes do redirecionamento o Shell criar um Arq vazio. Para colocar mais informaes no final do arquivo eu deveria ter feito: $ cat >> Arq Redirecionamento da Sada de Erro Padro Assim como por padro o Shell recebe os dados do teclado e envia a sada para a tela, os erros tambm vo para a tela se voc no especificar para onde eles de- vem ser enviados. Para redirecionar os erros, use 2> SaidaDeErro. Note que en- tre o nmero 2 e o sinal de maior (>) no existe espao em branco. Vamos supor que durante a execuo de um script voc pode, ou no (depen- dendo do rumo tomado pela execuo do programa), ter criado um arquivo chamado /tmp/seraqueexiste$$. Como no quer ficar com sujeira no disco rgido, ao final do script voc coloca a linha a seguir: rm /tmp/seraqueexiste$$ Decifrando a Pedra de Roseta Para tirar aquela sensao que voc tem quando v um script Shell, que mais parece uma sopa de letrinhas ou um con- junto de hierglifos, vou lhe mostrar os principais caracteres especiais para que voc saia por a como Champollion deci- frando a Pedra de Roseta. Caracteres para remoo do significado. isso mesmo, quando no desejamos que o Shell interprete um caractere especfico, devemos escond-lo dele. Isso pode ser feito de trs maneiras difer- entes, cada uma com sua peculiaridade: Apstrofo (): quando o Shell v uma cadeia de caracteres entre apstrofos, ele retira os apstrofos da cadeia e no interpreta seu contedo. $ ls linuxm* linuxmagazine $ ls 'linuxm*' bash: linuxm* no such file U or directory No primeiro caso o Shell expandiu o asterisco e descobriu o arquivo linux- magazine para listar. No segundo, os apstrofos inibiram a interpretao do Shell e veio a resposta que no existe o arquivo linuxm*. Contrabarra ou Barra Invertida (\): i- dntico aos apstrofos exceto que a barra invertida inibe a interpretao somente do caractere que a segue. Suponha que voc, acidentalmente, tenha criado um arquivo chamado * (asterisco) o que alguns sabores de Unix permitem e deseja remov-lo. Se voc fizesse: $ rm * Voc estaria na maior encrenca, pois o rm removeria todos os arquivos do diretrio corrente. A melhor forma de fazer o servio : $ rm \* Desta forma, o Shell no interpreta o asterisco, evitando a sua expanso. Faa a seguinte experincia cientfica: $ cd /etc $ echo '*' 84 Agosto 2004 www.linuxmagazine.com.br Papo de Botequim LI NUX USER Como j havia dito, o Shell resolve a linha e depois manda o comando para a execuo. Assim, se voc redirecionar a sada de um arquivo para ele prprio, primeiramente o Shell esvaziaeste arquivo e depois manda o comando para execuo! Desta forma, para sua alegria, voc acabou de perder o contedo de seu querido arquivo. Redirecionamento Perigoso Caso o arquivo no existisse seria envi- ado para a tela uma mensagem de erro. Para que isso no acontea faa: rm /tmp/seraqueexiste$$ 2> U /dev/null Para que voc teste a Sada de Erro Pa- dro direto no prompt do seu Shell, vou dar mais um exemplo. Faa: $ ls naoexiste bash: naoexiste no such file U or directory $ ls naoexiste 2> arquivodeerros $ $ cat arquivodeerros bash: naoexiste no such file U or directory Neste exemplo, vimos que quando fize- mos um ls em naoexiste, ganhamos uma mensagem de erro. Aps redirecionar a Sada de Erro Padro para arquivodeerros e executar o mesmo comando, recebe- mos somente o prompt na tela. Quan- do listamos o contedo do arquivo para o qual foi redirecionada a Sada de Erro Padro, vimos que a mensagem de erro tinha sido armazenada nele. interessante notar que estes carac- teres de redirecionamento so cumula- tivos, isto , se no exemplo anterior fizssemos o seguinte: $ ls naoexiste 2>> U arquivodeerros a mensagem de erro oriunda do ls seria anexada ao final de arquivodeerros. Redirecionamento da Entrada Padro Para fazermos o redirecionamento da En- trada Padro usamos o < (menor que). E pra que serve isso?, voc vai me per- guntar. Deixa eu dar um exemplo, que voc vai entender rapidinho. Suponha que voc queira mandar um mail para o seu chefe. Para o chefe ns caprichamos, n? Ento ao invs de sair redigindo o mail direto no prompt, de forma a tornar impossvel a correo de uma frase anterior onde, sem querer, voc escreveu um ns vai, voc edita um arquivo com o contedo da mensa- gem e aps umas quinze verificaes sem constatar nenhum erro, decide envi-lo e para tal faz: $ mail chefe@chefia.com.br < U arquivocommailparaochefe e o chefe receber uma mensagem com o contedo do arquivocommailparaochefe. Outro tipo de redirecionamento muito louco que o Shell permite o chamado here document. Ele representado por << e serve para indicar ao Shell que o escopo de um comando comea na linha seguinte e termina quando encontra uma linha cujo contedo seja unicamente o label que segue o sinal <<. Veja o fragmento de script a seguir, com uma rotina de ftp: ftp -ivn hostremoto << fimftp user $Usuario $Senha binary get arquivoremoto fimftp neste pedacinho de programa temos um monte de detalhes interessantes: As opes usadas para o ftp (-ivn) servem para ele listar tudo que est acontecendo (opo -v de verbose), para no ficar perguntando se voc tem certeza que deseja transmitir cada arquivo (opo -i de interactive) e finalmente a opo -n serve para dizer ao ftp para ele no solicitar o usurio e sua senha, pois estes sero informados pela instruo especfica (user); Quando eu usei o << fimftp, estava dizendo o seguinte para o interpreta- dor: Olha aqui Shell, no se meta em nada a partir deste ponto at encontrar o label fimftp. Voc no entenderia droga nenhuma, j que so instrues especficas do ftp. Se fosse s isso seria simples, mas pelo prprio exemplo d para ver que existem duas variveis ($Usuario e $Senha), que o Shell vai resolver antes do redirecionamento. Mas a grande vantagem deste tipo de construo que ela permite que comandos tam- bm sejam interpretados dentro do escopo do here document, o que, alis, contraria o que acabei de dizer. Logo a seguir te explico como esse negcio funciona. Agora ainda no d, esto faltando ferramentas. O comando user do repertrio de instrues do ftp e serve para passar o usurio e a senha que haviam sido lidos em uma rotina anterior a este fragmento de cdigo e colocados res- pectivamente nas duas variveis: $Usuario e $Senha. O binary outra instruo do ftp, que serve para indicar que a transferncia de arquivoremoto ser feita em modo binrio, isto o contedo do arquivo no ser inteerpretado para saber se est em ASCII, EBCDIC, O comando get arquivoremoto diz ao cliente ftp para pegar este arquivo no servidor hostremoto e traz-lo para a nossa mquina local. Se quisssemos enviar um arquivo, bastaria usar, por exemplo, o comando put arquivolocal. Redirecionamento de comandos Os redirecionamentos de que falamos at agora sempre se referiam a arquivos, isto , mandavam para arquivo, recebiam de arquivo, simulavam arquivo local, O que veremos a partir de agora, redirecio- na a sada de um comando para a entra- da de outro. utilssimo e, apesar de no ser macaco gordo, sempre quebra os 85 www.linuxmagazine.com.br Agosto 2004 LI NUX USER Papo de Botequim Preste ateno! No confunda >> com 2>. O primeiro anexa dados ao final de um arqui- vo, e o segundo redireciona a Sada de Erro Padro (stderr) para um arquivo que est sendo designado. Isto importante! Dados ou Erros? O $$ contm o PID, isto , o nmero do seu processo. Como o Linux multiusurio, bom anexar sempre o $$ ao nome dos seus arquivos para no haver problema de propri- edade, isto , caso voc batizasse o seu ar- quivo simplesmente como seraqueexiste, a primeira pessoa que o usasse (criando-o ento) seria o seu dono e a segunda ganharia um erro quando tentasse gravar algo nele. Direito de Posse Um erro comum no uso de labels (como o fimftp do exemplo anterior) causado pela presena de espaos em branco antes ou aps o mesmo. Fique muito atento quanto a isso, por que este tipo de erro costuma dar uma boa surra no programador, at que seja detectado. Lembre-se: um label que se preze tem que ter uma linha inteira s para ele. Etiquetas Erradas $ echo "Existem who | wc -l U usuarios conectados" Existem who | wc -l usuarios U conectados Hi! Olha s, no funcionou! mesmo, no funcionou e no foi por causa das aspas que eu coloquei, mas sim por que eu teria que ter executado o who | wc -l antes do echo. Para resolver este proble- ma, tenho que priorizar a segunda parte do comando com o uso de crases: $ echo "Existem `who | wc -l` U usuarios conectados" Existem 8 usuarios U conectados Para eliminar esse monte de brancos antes do 8 que o wc -l produziu, basta retirar as aspas. Assim: $ echo Existem `who | wc -l` U usuarios conectados Existem 8 usuarios conectados As aspas protegem da interpretao do Shell tudo que est dentro dos seus lim- ites. Como para o Shell basta um espao em branco como separador, o monte de espaos ser trocado por um nico aps a retirada das aspas. Outra coisa interessante o uso do ponto-e-vrgula. Quando estiver no Shell, voc deve sempre dar um comando em cada linha. Para agrupar comandos em uma mesma linha, temos que separ-los por ponto-e-vrgula. Ento: $ pwd ; cd /etc; pwd ;cd -;pwd /home/meudir /etc /home/meudir Neste exemplo, listei o nome do diretrio corrente com o comando pwd, mudei para o diretrio /etc, novamente listei o nome do diretrio e finalmente voltei pa- ra o diretrio onde estava anteriormente (cd -), listando seu nome. Repare que coloquei o ponto-e-vrgula de todas as formas possveis, para mostrar que no importa se existem espaos em branco antes ou aps este caracter. Finalmente, vamos ver o caso dos parnteses. No exemplo a seguir, colo- camos diversos comandos separados por ponto-e-vrgula entre parnteses: $ (pwd ; cd /etc ; pwd) /home/meudir /etc $ pwd /home/meudir Quequeiiisso minha gente? Eu estava no /home/meudir, mudei para o /etc, constatei que estava neste diretrio com o pwd seguinte e quando o agrupamento de comandos terminou, eu vi que conti- nuava no /etc/meudir! Hi! Ser que tem coisa do mgico Mandrake por a? Nada disso. O interes- sante do uso de parnteses que eles invocam um novo Shell para executar os comandos que esto em seu interior. Desta forma, fomos realmente para o diretrio /etc, porm aps a execuo de todos os comandos, o novo Shell que estava no diretrio /etc morreu e retor- namos ao Shell anterior que estava em /home/meudir. Que tal usar nossos novos conceitos? $ mail suporte@linux.br << FIM Ola suporte, hoje as `date U +%hh:mm` ocorreu novamente U aquele problema que eu havia U reportado por telefone. De U acordo com seu pedido segue a U listagem do diretorio: `ls -l` Abracos a todos. FIM Finalmente agora podemos demonstrar o que conversamos anteriormente sobre here document. Os comandos entre crases tem prioridade, portanto o Shell os executar antes do redirecionamento do here document. Quando o suporte receber a mensagem, ver que os comandos date e ls foram executados antes do comando mail, recebendo ento um instantneo do ambiente no momento de envio do email. - Garom, passa a rgua! I maiores galhos. Seu nome pipe (que em ingls significa tubo, j que ele cana- liza a sada de um comando para a entrada de outro) e sua representao a | (barra vertical). $ ls | wc -l 21 O comando ls passou a lista de arquivos para o comando wc, que quando est com a opo -l conta a quantidade de li- nhas que recebeu. Desta forma, pode- mos afirmar categoricamente que no meu diretrio existiam 21 arquivos. $ cat /etc/passwd | sort | lp A linha de comandos acima manda a listagem do arquivo /etc/passwd para a entrada do comando sort. Este a classi- fica e envia para o lp que o gerenciador da fila de impresso. Caracteres de ambiente Quando queremos priorizar uma expres- so, ns a colocamos entre parnteses, no ? Pois , por causa da aritmtica normal pensarmos deste jeito. Mas em Shell o que prioriza mesmo so as crases (`) e no os parnteses. Vou dar exemp- los para voc entender melhor. Eu quero saber quantos usurios esto logados no computador que eu admi- nistro. Eu posso fazer: $ who | wc -l 8 O comando who passa a lista de usurios conectados ao sistema para o comando wc -l, que conta quantas linhas recebeu e mostra a resposta na tela. Muito bem, mas ao invs de ter um nmero oito solto 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; ento vamos ver como que fica: 86 Agosto 2004 www.linuxmagazine.com.br Papo de Botequim LI NUX USER Julio Cezar Neves Analista de Su- porte de Sistemas desde 1969 e tra- balha com Unix desde 1980, quando fez parte da equipe que desenvolveu o SOX, sistema operacional, similar ao Unix, da Cobra Computadores. professor do curso de Mestrado em Software Livre das Faculdades Estcio de S, no Rio de Janeiro. S O B R E O A U T O R Em Unix existe um arquivo fantasma. Chama-se /dev/null. Tudo que enviado para este arquivo some. Assemelha-se a um Buraco Negro. No caso do exemplo, como no me interessava guardar a possvel men- sagem de erro oriunda do comando rm, redi- recionei-a para este arquivo. Buraco Negro