====== UNIX: Uso básico do Shell ====== ===== O shell ===== O //shell// é o programa que permite a interação do usuário com o sistema, em modo texto. Em UNIX existem vários tipos de //shell//, com funcionalidades diversas. Os mais conhecidos são: * //Bourne shell// (sh): o mais antigo, está presente em quase todos os sistemas, pois é necessário para diversas operações administrativas. * //C shell// (csh): de sintaxe mais simples, é mais fácil de usar e por isso preferido pelos usuários iniciantes. É o //shell// default do sistema //Solaris//. * //Korn shell// (ksh): mistura características de ambos os anteriores. Muito usado em ambientes IBM e HP. * //BASH Shell// (bash): //Bourne-Again Shell//, é uma extensão do //sh// e utilizado como padrão nas máquinas Linux. Neste curso estaremos usando o //shell// chamado **bash**. Para informações específicas sobre esse **shell** consulte sua página de manual (''man bash''). ===== A linha de comando ===== O uso do //shell// se baseia em comandos digitados em uma linha de comando. Os comandos têm normalmente a seguinte sintaxe: ''comando opções parâmetros'' Por exemplo: $ ls -l /etc Cada comando possui suas opções, que podem ser conhecidas através da página de manual respectiva. Ao receber um comando digitado pelo usuário, o //shell// executa as seguintes ações, em sequência: - ler a linha de comando e quebrá-la em palavras - armazenar a linha no histórico - resolver variáveis de ambiente - resolver aliases de comandos - resolver //wildcards// (caracteres curingas ou metacaracteres) - lançar cada um dos comandos com seus parâmetros - esperar o fim dos comandos - voltar ao início Essas ações são executadas repetidamente até o encerramento do //shell//, seja pela morte do processo ou pelo comando ''exit''. ===== Wildcards ===== //Wildcards// são caracteres que permitem designar nomes genéricos para arquivos e diretórios na linha de comando. O Bash permite o uso das seguintes possibilidades de //wildcards//: ''*'' : designa qualquer //string// com zero ou mais caracteres. Para listar todos os arquivos que começam com a letra ''c'' no diretório ''/usr/bin'': $ ls -l /usr/bin/c* Idem, arquivos cujo nome contém a //string// ''''coa'''' em qualquer posição: $ ls -l /usr/bin/*coa* Idem, arquivos cujo nome contém as letras ''c'', ''e'' e ''s'' em sequência: $ ls -l /usr/bin/*c*e*s* ''?'' : designa qualquer caractere único. Para listar todos os arquivos cujo nome contém três letras no diretório ''/etc'': $ ls -l /etc/??? Idem, arquivos cujo nome contém ''a'' como segunda letra: $ ls -l /etc/?a* ''[]'' : designa um conjunto de caracteres. Para listar todos os arquivos que começam com uma vogal minúscula no diretório ''/etc'': $ ls -l /etc/[aeiou]* Idem, arquivos contendo dois dígitos consecutivos: $ ls -l /etc/*[0-9][0-9]* ''{,}'' : permite definir padrões alternativos. Por exemplo, para remover todos os arquivos ''.doc'' ou ''.pdf'' do diretório ''/tmp'': $ rm /tmp/{*.doc,*.pdf} Idem, para remover arquivos contendo as strings ''abc'' **ou** ''xyz'': $ rm /tmp/*{abc,xyz}* ===== Variáveis ===== O //shell// permite a criação de variáveis para armazenar valores durante uma sessão de trabalho ou em scripts. Existem dois tipos de variáveis: locais e exportáveis ou variáveis de ambiente. As variáveis exportáveis ou de ambiente: são acessíveis a todos os comandos lançados pelo //shell// (são transferidas a todos os processos filhos daquele //shell//). Normalmente são escritas em letras maiúsculas. Para criar uma variável de ambiente basta executar ''export VAR=valor''. Observe que não pode haver espaços em brancos entre o nome da variável, o sinal de atribuição ''='' e o conteúdo da variável. Para destruir uma variável basta utilizar o comando ''unset''. Exemplo: $ export JDKHOME=/usr/local/jdk $ echo $JDKHOME $ unset JDKHOME Para acessar o conteúdo de uma variável basta utilizar o caractere $ antes do nome da variável. Um outro exemplo de utilização: $ export JDKHOME=/usr/local/jdk $ echo ${JDKHOME} $ unset JDKHOME Algumas variáveis de ambiente exportáveis têm valor pré-definido pelo //shell//, e são importantes para o funcionamento normal da sessão de trabalho. Vejamos as principais (a lista de variáveis exportáveis pode ser consultada através do comando ''env''): * ''PATH'' : define os diretórios onde podem ser encontrados programas executáveis * ''MANPATH'' : define os diretórios contendo páginas de manual * ''USER'' : nome de login do usuário da sessão * ''HOME'' : diretório //home// do usuário * ''HOST'' : nome do //host// (máquina) * ''SHELL'' : //shell// ativo * ''TERM'' : tipo de terminal * ''MAIL'' : localização da caixa de correio do usuário no sistema local As variáveis locais são acessíveis somente dentro do //shell// onde foram criadas. Para criar uma variável local basta fazer ''var=valor'', repare que não pode existir espaços em brancos entre o nome da variável, o sinal de atribuição ''='' e o conteúdo da variável. Para destruir uma variável basta utilizar o comando ''unset''. $ nome=joao $ echo $nome $ touch $nome.txt $ unset nome $ nomes=( joao maria pedro antonio ) $ echo ${nomes[2]} $ mkdir ${nomes[3]} $ unset nomes As variáveis locais podem armazenar listas de valores, úteis sobretudo na construção de //scripts//. A forma de definição e uso de variáveis contendo listas segue a seguinte sintaxe: * ''$nome'' : o conteúdo da variável nome * ''${nome[x]}'' : o conteúdo da variável, na posição x * ''${nome[@]}'' : o conteúdo de toda a lista de valores contida na variável * ''${#nome[@]}'' : o número de posições (entradas) da variável * ''${#nome}'' : o número de caracteres da variável (na entrada indicada, se existir mais de uma) Vejamos alguns exemplos: $ nome=( joao maria pedro antonio luis ) $ echo $nome joao $ echo ${nome[3]} antonio $ echo ${#nome[@]} 5 $ echo ${#nome} 4 ===== Aliases ===== O //shell// permite facilmente a criação de novos comandos ou a redefinição de comandos já existentes, através de aliases. Por exemplo, para criar um alias ''copy'' para o comando '''cp -i''' , basta executar: $ alias copy='cp -i' Assim, ''copy'' torna-se um comando válido durante a sessão corrente (veremos logo a seguir como criar aliases permanentes). Os aliases podem usar variáveis de ambiente também, como mostra o seguinte exemplo: $ alias ola='echo "Olá $LOGNAME, como vai você?"' Para desativar um alias basta usar o comando ''unalias'': $ unalias ola Os aliases existentes na sessão podem ser consultados usando o comando ''alias'' sem parâmetros. ===== Histórico ===== Todos os comandos executados em uma sessão são memorizados pelo //shell//, e podem ser consultados e reexecutados quando desejado. Para consultar o histórico basta executar o comando ''history''. Os comandos que são digitados são armazenados dentro do arquivo ''.bash_history'' que está em seu diretório de trabalho. Os comandos de uso do histórico começam sempre pelo sinal ''!'' (ponto de exclamação). Vejamos os mais comuns: * ''!132'' : reexecuta o comando de número 132 do histórico * ''!-2'' : reexecuta o penúltimo comando * ''!!'' : reexecuta o comando anterior (equivale a !-1) * ''!gr'' : reexecuta o último comando começando com as letras ''gr'' ===== Configuração ===== Ao ser lançado, o //shell// lê arquivos de configuração que contém comandos para definir o ambiente de trabalho de cada usuário. A sintaxe dos arquivos de configuração é bastante simples, similar à sintaxe das linhas de comando. O //Shell Bash// lê os arquivos de configuração, caso existam, na sequência apresentada a seguir: * ''/etc/profile'' : contém configurações comuns a todos os usuários; executado no momento do login. * ''~/.profile'' : contém configurações específicas ao usuário; executado no momento do login. * ''/etc/bash.bashrc'' : contém configurações comuns a todos os usuários; executado durante lançamento de cada shell. * ''~/.bashrc'' : contém configurações específicas ao usuário; executado durante lançamento de cada //shell//. Para criar variáveis e aliases permanentes, ou para executar comandos ao iniciar o //shell//, basta inserir os comandos correspondentes no arquivo desejado. Por exemplo, se inserirmos o comando alias ola='echo "ola $LOGNAME, como vai voce"' no arquivo ''~/.bashrc'', no próximo lançamento de //shell// ele será lido e fará parte dos comandos disponíveis ao usuário. ===== Exercícios ===== - Crie aliases para os comandos ''copy'', ''ren'', ''del'', ''type'', ''dir'' e ''move'' do MS-DOS, e os inclua no arquivo de inicialização do //shell//. - Coloque uma mensagem de boas-vindas na inicialização do //shell//, com o conteúdo abaixo. Para as linhas de data e hora, consulte as páginas de manual dos comandos ''date'' e ''echo''. Ola usuário joão Seja bem-vindo à máquina server1 Data: 07/04/1999 Horário: 19:35:42