Shell
Por exemplo, para o usuário ler um arquivo qualquer, toda esta hierarquia é seguida: USUÁRIO SHELL KERNEL DISCO RÍGIDO A idéia de um Shell foi concebida na época em que a interface pela qual os usuários de computadores podiam trabalhar com o computador era muito limitada. Além disso os recursos eram limitados, CPU e memória. Existia apenas um teclado, sem mouse, sem som, sem efeitos gráficos bonitos. O modo pelo qual o usuário se comunica com o computador nessa interface é escrevendo os programas que se deseja abrir.
Os interpretadores são vários, ksh, csh, zsh, sh e bash. Entre os diversos interpretadores existentes os usuários de Linux utilizam mais o bash. É como se os programas fossem funções e o Shell fosse a interação entre os programas. Shell script é uma linguagem interpretada indispensável para administradores Unix. 3 O que é o Shell? O Shell é a ligação entre o usurário e o sistema. É ele quem interpreta os comandos entrados para outros aplicativos ou directamente em chamadas de sistema.
Alem disso, os recursos do Shell são indispensáveis para lidar com muitos arquivos ao mesmo tempo, para realizar uma tarefa r ou para programar uma acça 20F 10 arquivos ao mesmo tempo, para realizar uma tarefa repetidamente ou para programar uma acçã muitos arquivos ao mesmo tempo, para realizar uma tarefa repetidamente ou para programar uma acção para determinada ocasião, entre outros recursos. Começamos apresentando os tipos de Shell mais difundidos e depois definindo alguns conceitos que serão úteis na sua utilização, para então tratarmos de exemplos práticos.
Tipos de Shell O mais comum de todos é o Shell Bourne (sh), desenvolvido a partir de Shell original, escrito em 1975 por S. R. Bourne. Mais tarde, alguns estudantes da Universidade da Califórnia em Berkeley criaram o Shell C (csh), útil para quem é familiar com a sintaxe da linguagem de programação C. O terceiro dos mais difundidos é o Shell Korn, criado por Dadid Korn da AT&T, que preserva a funcionalidade do Bourne incluindo as características poderosas do Shell C. Actualmente o Linux e a maioria dos sistemas UNIX contam com o bash ou Bourne Again Shell e uma versão melhorada do Shell C, o tcsh.
Nossa discussão aqui está direccionada ao tcsh, mas os tópicos aplicam-se aos outros e as diferenças relevantes erão mencionadas. A escolha do Shell depende principalmente das preferências pessoais de cada usurário, pois os principais recursos estão presentes em qualquer das alternativas. Inicialização do Shell Para que o usurário abra sua sessão, tanto local como remotamente, é preciso que ele digite o seu nome e senha para o programa login, quem irá iniciar a sessão do usuário no sistema. O login examina se o nome informado consta na lista de usurários e se sua senha confere com aquela armazenada.
Em caso de sucesso, o login chama o Shell configurado para esse usuário. Esta informação está guardada no arquivo /etc/passwd na maioria dos sistemas, junta 30FIO para esse usuário. Esta informação está guardada no arquivo /etc/passwd na maioria dos sistemas, juntamente com o nome do usuário, sua senha criptografada, seu número de identificação, o número de identificação do seu grupo, uma descrição do usuário, seu directório padrão (HOME) e o Shell de seu uso, nesta ordem. Os campos estão separados por dois pontos (:). Passados os processos de login em si, o Shell executa os comandos nos arquivos de sistema /etc/ sh. shrc e /etc/csh. login e depois procura pelos arquivo de inicialização . tcshrc, no directório HOME do usuário. Em caso de não existir este arquivo, o Shell procura por —/. cshrc. finalmente o Shell executa —/. login e —/. history, recaindo no prompt, quando está pronto para receber as entradas do usuário. 4 Os arquivos de inicialização em ‘etc servem para estabelecer configurações pertinentes às particularidades do sistema como um todo, enquanto os arquivos de inicialização de cada usuário permitem que cada um ajuste o comportamento o Shell ao seu gosto.
Estes arquivos podem contem quaisquer comandos que façam sentido ao Shell, que os executará na ordem que os encontrar. As tarefas mais comuns realizadas a partir destes arquivos são gerenciamento básico de arquivos, como apagar arquivos temporários, definição de variáveis de ambiente (sessão 1 0) de aplicativos e do próprio usurário e criação de apelidos de comandos (sessão 12). Descritores Padrão de Arquivos Os arquivos no ambiente UNIX possuem forma livre, consistindo apenas de uma sequência de caracteres.
As quebras e linha (nova linha) são delimitadas por caracteres d 40FIO Ctrl + d, que rep , enquanto o final de arquivo delimitado por ou de linha (nova linha) são delimitadas por caracteres de nova linha
, enquanto o final de arquivo delimitado por ou caracteres de nova linha
, enquanto o final de arquivo delimitado por ou Ctrl + d, que representam EOF (End Of File). Cada arquivo pode ser lido caractere a caractere e gerado da mesma forma. Para se referir a um arquivo, o sistema usa os descritores de arquivos, que são palavras chave associadas a cada arquivo.
Os sistemas de arquivos erão explicados em maior detalhe numa sessão adiante, mas este conceito nos serve para entender um ponto chave do trabalho do shell. O Shell define três descritores de arquivos muito importantes: E a entrada padrão (stdin): como o nome sugere, a entrada padrão é o descritor de arquivo de onde um aplicativo lerá a entrada de dados se não for informado um outro descritor de arquivos especifico. Está normalmente associada ao terminal de entrada, normalmente o teclado. saída padrão (stdout): é o descritor onde será colocada a saída de qualquer aplicativo, se utro específico n—ao for informado. Normalmente associada ao terminal de saída, o vídeo. saída de erro padrão (stderr): é onde são escritos os erros decorrentes do processamento. Está separada da saída padrão para que os possíveis erros ou avisos não contaminem os resultados em si. Também está associada ao terminal de saída. Neste contexto, as maioria dos comandos do Shell agem como filtros, que possuem uma única entrada (stdin) e duas saídas (stdout e stderr), por onde entra e sai um caractere por vez.
O que cada comando faz é filtrar a entrada, ransformando-a e escrevendo-a na saída padrão, enquanto as eventuais mensagens de erro vão para a saída de erros. 50F 10 5 File). Cada arquivo pode ser lido caractere a caractere e gerado da mesma torma. Para se reterir a um arquivo, o Redireccionamentos Os recursos de redireccionamento de entrada e saída (EIS) são úteis para redefinir as entradas e saídas padrão em outros descritores de arquivos definidos pelo usuário. A tabela a seguir mostra a função dos operadores de redireccionamento para os dois principais tipo de shells. ash/ksh tcsh < (arquivo) > (arquivo) (arquivo) &1 2 1 &>! (arquivo) 2 > &1 1 acção considera (arquivo) como stdin coloca a stdout no novo (arquivo) anexa stdout ao (arquivo) (ou cria-o) toma como stdin at_e encontrar (delimi) re_une stdout com stderr anexa stderr a stdout sobrescreve stdout em (arquivo) re_une stderr e stdout no duto Por exemplo, para criar uma arquivo com a lista dos arquivos de um directório, faríamos: $ Is -l > lista_de_arquivos se lista de arquivos já existisse, poderíamos sobreescrevê-lo $ Is -l >! lista_de_arquivos ou acrescentar a nova listagem ao final do arquivo $ Is -l lista_de_arquivos.
Em todos estes exemplos, ao invés de colocar a saída padrão na tela, todo o seu conteúdo vai para outros arquivos, isto é, estamos redefinindo a saída padrão. A operação análoga pode ser feita com a entrada padrão. Por exemplo, na situação em que quiséssemos mandar um arquivo como conteúdo de uma mensagem de correio electrónico, simplesmente faríamos: $ mail (endereço) < (mensagem) Porém, podemos reunir ambos conceitos numa mesma situação em que determinado programa lê seus parâmetros iniciais de um arquivo e grava-os em outro.
Para ordenar s nomes dentro de um dado arquivo e gravá-los em outro, simplesmente diríamos: $ sort < fora_de_ordem > ordenados Neste caso, como em muitos dos aplicativos UNIX, é suposto que o primeiro 60F 10 ordenados Neste caso, como em muitos dos aplicativos UNIX, é suposto que o primeiro argumento trata-se da entrada padrão, de forma que poderíamos omitir o sinal de astros mercúrio Vénus terra Marte Júpiter Ctrl + d Aqui o cat imprimirá a entrada padrão, que como não foi especificada permanece sendo o teclado, na saída padrão, que agora é o arquivo astros.
Então podemos entrar a lista de planetas até que Ctrl + d (caractere de fim de arquivo – EOF) seja pressionado. Neste momento, o cat grava o nome dos planetas no arquivo. O recurso dos delimitadores também é útil quando o argumento de entrada tem mais de uma linha. Neste exemplo usamos os comando cat, que serve para imprimir a entrada padrão na saída padrão sem qualquer formatação, para imprimir as seguintes linhas: $ cat turma 7 Desta forma o cat concatena alunos e alunas numa mesma saída padrão, que servirá como entrada padrão para o sort, que terá sua saída redireccionada para o arquivo turma.
O comando anterior sem o uso de dutos seria escrito: $ cat alunos alunas > alunosealunas Figura 1 : Um duto entre dois filtros. $ sort alunosealunas > turma $ rm alunosealunas Na forma tradicional a quantidade de comandos é maior e há a necessidade de usar o arquivo temporário alunosealunas. Também é possível usar mais de um duto na mesma linha de comando.
Para imprimir directamente a saída do processo acima simplesmente acrescente o comando de impressão Ipr $ cat alunos alunas I sort I Ipr Caracteres Especiais e Curingas 70FIO Para facilitar o manuseio de arquivos o Shell dá sentid rtos tipos de caracteres que mudam de valor Para facilitar o manuseio de arquivos o Shell dá sentido especial a certos tipos de caracteres que mudam de valor que mudam de valor conforme o uso a que se dá a eles, por isso chamados de curingas (formalmente: metacaracteres). Estas regras tendem a reduzir a digitação e encorajar convenções na nomeação de arquivos.
Os curingas são os seguintes: E E E *: poderá ser substituído por zero ou mais caracteres. ?: poderá ser substituído por um caractere. [… ]: poderá ser substituído por um dos caracteres entre colchetes. Por exemplo, se tivéssemos os arquivos dial , dia2 e dia3, poderíamos concatená-los todos usando os curingas apropriados, sem mencionar explicitamente cada um dos nomes. Neste caso, existem três possibilidades de realizar o mesmo trabalho $ cat dia* > dias $ cat dia? > dias $ cat dia[123] > dias Estes conceitos podem ser generalizados e superpostos, isto é, ? da* poderia ser coincidir com cidade, mas não opacidade nem claridade. Da mesma forma, cor[ear][sle] 8 passaria por cores, coral e corre (analise as outras combinações possíveis). Além disso, você poderá especificar um ntervalo de caracteres, ou seja, a expressão [a-z] significa qualquer caractere minúsculo e [0-9] qualquer número. Para complementar estas possibilidades, existe o caracteres de negação b, usado em associação com os colchetes Se escrevemos aluno[bO-9] estamos nos referindo aos nome que começam com a palavra aluno não seguida dos números de O a 9.
Existem outros caracteres especiais para o Shell além dos curingas. Um deles é o ponto e vírgula (;) que serve para colocar múltiplos comandos numa mesma linha. Assim escrevendo: $ cd fazenda; rm cavalos* ; cd . exterminaríamos todos os equinos de uma vez e volt rectório anterior. 80FIO que mudam de valor contorme o uso a que se dã a eles, por isso chamados de curingas (tormalmente: exterminaríamos todos os equinos de uma vez e voltaríamos ao directório anterior. Controle de Processos equinos de uma vez e voltaríamos ao directório anterior.
Outra característica de operação bastante útil está relacionada ao caractere &. Lembrese que o Linux, sendo um sabor de UNIX, é multiusuário e multitarefa. Isso significa que vários usuários podem estar usando o mesmo computador e executando mais de uma tarefa ao mesmo tempo, com os recursos compartilhados. Assim, se desejássemos colocar um determinado programa para ser executado em segundo plano, anexaríamos o caractere & depois do comando. Imagine que um programa seu chamado chuva levaria dias executando e você não quer esperar que ele termine ou precisa continuar trabalhando.
Bastaria executá-lo como $ chuva & [1 ] 925 e o Shell o colocará em segundo plano, informando a ordem dentre os seus processos ([1 J) e a ordem geral do processo (925). O processamento em segundo plano é um recurso poderoso quando bem utilizado, permitindo que preencha-se o tempo ocioso dos computadores, ntretanto lembre-se que se o programa não terminar por si próprio ficará rodando até que seja explicitamente morto, como no caso de uma reinicialização ou através do comando kill.
Uma maneira alternativa de colocar um programa já iniciado em segundo plano é através da sequência de teclas Ctrl + z , ou: $ chuva Ctrl + z Suspended $ bg [1 ] chuva & pois quando Ctrl + z é pressionado o programa é suspenso até que a ordem bg (de background ou segundo plano) faz com que sua execução continue em segundo plano, exactamente de onde tinha parado quando o Shell suspendeu-o, em nenhuma alteração de seus dados ou parâmetros.
Outra utilidade deste recurso consiste em suspender um aplicativo, realizar outra tarefa e depoi gOFIO utilidade deste recurso consiste em suspender um aplicativo, realizar outra tarefa e depois continuar executando-o. No exemplo anterior $ chuva Ctrl + z 9 Suspended $ sol sol: Command not found. $ fg chuva aqui a ordem fg serve para recolocar o ultimo aplicativo que foi para segundo plano (bg) para primeiro plano (fg de foreground).
Se há vários processos em segundo plano, é possível identificá-los antecedendo o número do processo por %, isto é fg %1 , neste caso. Substituição da Saída Padrão A substituição de stdin é outro poderoso recurso do Shell usado através dos acentos graves C • Os graves servem para que o usuário coloque a saída da execução de um programa como argumento de outro, de uma maneira diferente daquela com dutos.
Por exemplo, o comando which (qual) serve para mostrar aonde o Shell está achando determinado aplicativo. Se fizemos: $ which cat /bin/cat somos informados que o Shell executa o cat que estáa em /bin. Se quisermos saber as propriedades do arquivo cat, usamos o Is em conjunto com os acentos graves $ Is • which catu e a saída do hich cat servirá de argumento para a execução do Is.