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áveisMANPATH: define os diretórios contendo páginas de manualUSER: nome de login do usuário da sessãoHOME: diretório home do usuárioHOST: nome do host (máquina)SHELL: shell ativoTERM: tipo de terminalMAIL: 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 letrasgr
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,diremovedo 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
dateeecho.
Ola usuário joão Seja bem-vindo à máquina server1 Data: 07/04/1999 Horário: 19:35:42