Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
http://br.gnome.org/TWikiBar/TWikiBarPapo001
[ 15 Feb 2011 - 13:47 ] Links Amigos BR-Linux Viva o Linux Dicas-L Aurelio Thobias TWIKI BSICO Pgina Inicial ltimas Alteraes ndice Procura Estatsticas de Uso Aviso de Atualizao Mapa do Site TWIKI AVANADO Registre-se Configuraes Gerais Quem Somos Regras de Formatao Biblioteca Grfica Carinhas Grficas PROJETO GRFICO Pr Tpico Ps Tpico Menu Lateral Menu de Navegao CSS Utilizado Botes Especiais Indica Onde Estamos Cabealho Padro Copy Right/Left Voc est aqui: TWikiBar > BatePapos > TWikiBarPapo001 Controles: V.39] - ltima Atualizao: [21 Mar 2010 -
1 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
aquele sistema operacional que voc tem que dar dez boots por dia e no tem domnio nenhum sobre o que esta acontecendo no seu computador. Mas deixa isso pr l, vou te explicar o que Shell e os componentes de sua famlia e ao final da explanao voc dir: "Meu Deus do Shell! Porque eu no optei pelo Linux antes?".
O Ambiente Linux
Para voc entender o que e como funciona o Shell, primeiro vou te mostrar como funciona o ambiente em camadas do Linux. D uma olhada no grfico abaixo:
Neste grfico d para ver que a camada de hardware a mais profunda e formada pelos componentes fsicos do seu computador. Envolvendo esta, vem a camada do kernel que o cerne do Linux, seu ncleo, e quem bota o hardware para funcionar, fazendo seu gerenciamento e controle. Os programas e comandos que envolvem o kernel, dele se utilizam para realizar as tarefas aplicativas para que foram desenvolvidos. Fechando tudo isso vem o Shell que leva este nome porque em ingls, Shell significa concha, carapaa, isto , fica entre o usurio 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 kernel que o que interessa a todo aplicativo, necessria a filtragem do Shell, vamos entender como ele funciona de forma a tirar o mximo proveito das inmeras facilidades que ele nos oferece. O Linux por definio um sistema multiusurio - no podemos nunca esquecer disto e para permitir o acesso de determinados usurios e barrar a entrada de outros, existe um arquivo chamado /etc/passwd que alm fornecer dados para esta funo de "leo-de-chcara" do Linux, tambm prov informaes para o login daqueles que passaram por esta
2 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
primeira barreira. O ltimo campo de seus registros informa ao sistema qual Shell a pessoa vai receber ao se "logar" (ARGH!!!).
Shell que o usurio vai receber ao se "logar", para ser interpretado ao p-daletra, isto , se neste campo do seu registro estiver prog, a pessoa ao acessar o sistema receber a tela de execuo do programa prog e ao terminar a sua execuo ganhar imediatamente um logout. Imagine o quanto se pode incrementar a segurana com este simples artifcio.
Lembra que eu te falei de Shell, famlia, irmo? Pois , vamos comear a entender isto: o Shell, que se vale da imagem de uma concha envolvendo o sistema operacional propriamente dito, o nome genrico para tratar os filhos desta idia que, ao longo dos anos de existncia do sistema operacional Unix foram aparecendo. Atualmente existem diversos sabores de Shell, dentre estes eu destaco o sh (Bourne Shell), o ksh (Korn Shell), bash (Bourne Again Shell) e o csh (C Shell).
C Shell (csh)
Desenvolvido por Bill Joy da Berkley University o Shell mais utilizado em ambientes *BSD e Xenix. A estruturao de seus comandos bem similar da linguagem C. Seu grande pecado foi ignorar a compatibilidade com o sh, partindo por um caminho prprio.
3 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
Alm destes Shells existem outros, mas irei falar contigo somente sobre os trs primeiros, tratando-os genericamente por Shell e assinalando as especificidades de cada um que porventura hajam.
Atribuio
Se o Shell encontra dois campos separados por um sinal de igual (=) sem espaos em branco entre eles, identifica esta seqncia como uma atribuio. Exemplos
Neste exemplo o Shell identificou o ls como um programa e o linux como um parmetro passado para o programa ls.
Neste caso, por no haver espaos em branco (j d para notar que o branco um dos caracteres reservados) o Shell identificou uma atribuio e colocou 1000 na varivel valor.
4 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
Jamais Faa:
Neste caso, o Bash achou a palavra valor isolada por brancos e julgou que voc estivesse mandando executar um programa chamado valor, para o qual estaria passando dois parmetros: = e 1000.
Comando
Quando uma linha digitada no prompt do Linux, ela dividida em pedaos separados por espao em branco: o primeiro pedao o nome do programa que ter sua existncia pesquisada; identifica em seguida, nesta ordem, opes/parmetros, redirecionamentos e variveis. Quando o programa identificado existe, o Shell verifica as permisses dos arquivos envolvidos (inclusive o prprio programa), dando um erro caso voc no esteja credenciado a executar esta tarefa.
Resoluo de Redirecionamentos
Aps identificar os componentes da linha que voc teclou, o Shell parte para a resoluo de redirecionamentos. O Shell tem incorporado ao seu elenco de vantagens o que chamamos de redirecionamento, que pode ser de entrada (stdin), de sada (stdout) ou dos erros (stderr), conforme vou te explicar a seguir.
Substituio de Variveis
Neste ponto, o Shell verifica se as eventuais variveis (parmetros comeados por $), encontradas no escopo do comando, esto definidas e as substitui por seus valores atuais.
Substituio de Meta Caracteres
Se algum metacaractere (*, ? ou []) foi encontrado na linha de comando, neste ponto ele ser substitudo por seus possveis valores. Supondo que o nico arquivo no seu diretrio corrente comeado pela letra n seja um diretrio chamado nomegrandeprachuchu, se voc fizer:
Como at aqui quem esta trabalhando a sua linha o Shell e o comando (programa) cd ainda no foi executado, o Shell transforma o n* em
nomegrandeprachuchu e o comando cd ser executado com sucesso.
Completadas as tarefas anteriores, o Shell monta a linha de comandos, j com todas as substituies feitas, chama o kernel para execut-la em um
5 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
execuo do programa. Uma vez encerrado este processo (juntamente com o Shell filho), recebe novamente o controle e, exibindo um prompt, mostra que est pronto para executar outros comandos.
Voc estaria fazendo a maior encrenca, pois o rm removeria todos os arquivos do diretrio corrente. A melhor forma de fazer o pretendido :
6 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
Aspas (")
Exatamente igual ao apstrofo 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 o significado de cada um.
Caracteres de redirecionamento
A maioria dos comandos tem uma entrada, uma sada e pode gerar erros. Esta entrada chamada Entrada Padro ou stdin e seu default o teclado do terminal. Analogamente, a sada do comando chamada Sada Padro ou stdout e seu default a tela do terminal. Para a tela tambm so enviadas por default as mensagens de erro oriundas do comando que neste caso a chamada Sada de Erro Padro ou stderr. Veremos agora como alterar este estado de coisas. Vamos fazer um programa gago. Para isto faa:
O cat uma instruo que lista o contedo do arquivo especificado para a Sada Padro (stdout). Caso a entrada no seja definida, ele espera os dados da stdin. Ora como eu no especifiquei a entrada, ele est esperando-a pelo teclado (Entrada Padro) e como tambm no citei a sada, o que eu teclar ir para a tela (Sada Padro) fazendo desta forma, como eu havia proposto um programa gago. Experimente!
mandar a sada. Vamos transformar o programa gago em um editor de textos (que pretenso heim!).
7 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
O cat continua sem ter a entrada especificada, 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 teclado esta indo para dentro de Arq, de forma que fizemos o editor de textos mais curto e ruim do planeta. Se eu fizer novamente:
Os dados contidos em Arq sero perdidos, j que antes do redirecionamento o Shell criar um Arq vazio. Para colocar mais informaes no final do arquivo eu deveria ter feito:
Como j havia lhe 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 "esvazia" este arquivo e depois manda o comando para execuo, desta forma voc acabou de perder o contedo do seu querido arquivo.
Com isso d para notar que o >> (maior maior) serve para inserir texto no final do arquivo.
Preste ateno! No confunda >> com 2>. O primeiro anexa dados ao final de um arquivo, e o segundo redireciona a Sada de Erro Padro (stderr) para um arquivo que est sendo designado. Isso importante!
Suponha que durante a execuo de um script voc pode, ou no (dependendo do rumo tomado pela execuo do programa), ter criado um arquivo chamado /tmp/seraqueexiste$$. Para no ficar sujeira no seu disco, ao final do script voc colocaria uma linha:
8 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
Caso o arquivo no existisse seria enviado para a tela uma mensagem de erro. Para que isso no acontea deve-se fazer:
Dica # 1 O $$ contm o PID, isto , o nmero do seu processo. Como o Linux multiusurio, bom anexar sempre o $$ ao nome dos dos arquivos que sero usados por vrias pessoas para no haver problema de propriedade, isto , caso voc batizasse o seu arquivo simplesmente como seraqueexiste, o primeiro que o usasse (criando-o ento) seria o seu dono e todos os outros ganhariam um erro quando tentassem gravar algo nele.
Para que voc teste a Sada de Erro Padro direto no prompt do seu Shell, vou dar mais um exemplo. Faa:
Neste exemplo, vimos que quando fizemos um ls em naoexiste, ganhamos uma mensagem de erro. Aps, redirecionarmos a Sada de Erro Padro para arquivodeerros e executarmos o mesmo comando, recebemos somente o prompt na tela. Quando 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. Faa este teste ai.
Dica # 2 - Quem esse tal de /dev/null? - Em Unix existe um arquivo fantasma. Chama-se /dev/null. Tudo que mandado para este arquivo some. Assemelha-se a um Buraco Negro. No caso do exemplo, como no me interessava guardar a possvel mensagem de erro oriunda do comando rm, redirecionei-a para este arquivo.
interessante notar que estes caracteres de redirecionamento so cumulativos, isto , se no exemplo anterior fizssemos:
9 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
Here Document
Um outro tipo de redirecionamento muito louco que o Shell te permite o chamado here document. Ele representado por << (menor menor) 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 $Usurio $Senha binary get arquivoremoto fimftp
Neste pedacinho de programa temos um monte de detalhes interessantes: 1. As opes que usei para o ftp (-ivn) servem para ele ir listando tudo que est acontecendo (v de verbose), para no perguntar se voc tem certeza de que deseja transmitir cada arquivo (i de interactive), e finalmente a opo n serve para dizer ao ftp para ele no solicitar o usurio e sua senha, pois esses sero informados pela instruo especfica (user); 2. Quando eu usei o << fimftp, estava dizendo o seguinte para o intrprete: - Olhe aqui Shell, no se meta em nada a partir daqui at encontrar o
10 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
label fimftp. Voc no entenderia nada, j que so instrues especficas do comando ftp e voc no entende nada de ftp. Se fosse s isso seria simples, mas pelo prprio exemplo d para ver que existem duas variveis ($Usurio e $Senha), que o Shell vai resolver antes do redirecionamento. Mas a grande vantagem desse tipo de construo que ela permite que comandos tambm sejam interpretados dentro do escopo do here document, o que tambm contraria o que acabei de dizer. Logo a seguir explico como esse negcio funciona. Agora ainda no d, est faltando ferramenta. 3. 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 esse fragmento de cdigo e colocados respectivamente nas duas variveis: $Usurio e $Senha. 4. 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 interpretado para saber se est em ASCII, EBCDIC, ... 5. O get arquivoremoto diz ao ftp para pegar esse arquivo em
hostremoto e traz-lo para o nosso host local. Se fosse para mandar o
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.
- Est bem, est bem! Eu sei que dei uma viajada e entrei pelos comandos do ftp, fugindo ao nosso assunto que Shell, mas como sempre bom aprender e raro as pessoas estarem disponveis para ensinar...
Redirecionamento de Comandos
Os redirecionamentos que falamos at aqui sempre se referiam a arquivos, isto mandavam para arquivo, recebiam de arquivo, simulavam arquivo local, ... O que veremos a partir de agora redireciona a sada de um comando para a entrada de outro. utilssimo e quebra os maiores galhos. Seu nome pipe (que em ingls significa tubo, j que ele encana a sada de um comando para a entrada de outro) e sua representao uma barra vertical (|).
O comando ls passou a lista de arquivos para o comando wc, que quando est com a opo l conta a quantidade de linha que recebeu. Desta forma, podemos afirmar categoricamente que no meu diretrio existiam 21
11 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
arquivos.
Esta linha de comandos manda a listagem do arquivo /etc/passwd para a entrada do comando sort. Este a classifica e manda-a para o lp que o gerenciador do spool de impresso.
Caracteres de Ambiente
Quando quer priorizar uma expresso voc coloca-a 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 exemplos de uso das crases para voc entender melhor. Eu quero saber quantos usurios esto "logados" no computador que eu administro. Eu posso fazer:
O comando who passa a lista de usurios conectados para o comando wc l que conta quantas linhas recebeu e lista a resposta na tela. Pois bem, mas ao invs de ter um oito solto na tela, o que eu quero que ele esteja no meio de uma frase. Ora para mandar frases para a tela eu uso o comando echo, ento vamos ver como que fica:
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 problema, tenho que
priorizar esta segunda parte do comando com o uso de crases, fazendo assim:
Para eliminar esse monte de brancos antes do 8 que o wc -l produziu, basta tirar as aspas. Assim:
Como eu disse antes, as aspas protegem tudo que esta dentro dos seus limites, da interpretao do Shell. Como para o Shell basta um espao em
12 de 16
15/2/2011 12:57
http://br.gnome.org/TWikiBar/TWikiBarPapo001
branco como separador, o monte de espaos ser trocado por um nico aps a retirada das aspas. Antes de falar sobre o uso dos parnteses deixa eu mandar uma rapidinha sobre o uso de ponto-e-vrgula (;). Quando estiver no Shell, voc deve sempre dar um comando em cada linha. Para agrupar comandos em uma mesma linha teremos que separ-los por ponto-e-vrgula. Ento:
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 para 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 existe espaos em branco antes ou aps este caractere. Finalmente vamos ver o caso dos parnteses. Veja s o caso a seguir, bem parecido com o exemplo anterior:
- Ih! Ser que tem coisa de mgico a? - T me estranhando, rapaz? No nada disso! O interessante do uso de parnteses que ele invoca um novo Shell para executar os comandos que esto no seu interior. Desta forma, realmente fomos para o diretrio /etc, porm quando todos os comandos dentro dos parnteses foram executados, o novo Shell que estava no diretrio /etc morreu e voltamos ao Shell anterior cujo diretrio corrente era /home/meudir. Faa outros testes usando cd, e ls para voc firmar o conceito. Agora que j conhecemos estes conceitos veja s este exemplo a seguir:
13 de 16
15/2/2011 12:57