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
,dir
emove
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
eecho
.
Ola usuário joão Seja bem-vindo à máquina server1 Data: 07/04/1999 Horário: 19:35:42