Professional Documents
Culture Documents
Dezembro, 2009
Empresa Brasileira de Pesquisa Agropecuria
Embrapa Informtica Agropecuria
Ministrio da Agricultura, Pecuria e Abastecimento
Documentos 99
Autor
Apresentao
O Unix e suas vertentes (Linux, FreeBSD, OpenBSD, Solaris, etc) sempre
foi considerado pouco acessvel por muitas pessoas, sejam elas profissionais da rea de informtica ou no.
Hoje em dia, com a modernizao de ambientes grficos, como KDE e
GNOME, a utilizao desses diversos sabores de sistemas operacionais
derivados do Unix se tornaram um pouco mais populares, mesmo que
ainda bem abaixo de seu concorrente principal, o MS Windows.
Entretanto, o ponto forte do Unix no est nesses ambientes grficos mais
requintados dos dias de hoje, e sim na sua velha e tradicional linha de
comando e no que possvel se fazer atravs dela. E na interface destas
linhas de comando esto diversos Shells, que so como espcies de tradutores do que o usurio digita, e o kernel do sistema, que o crebro do
sistema operacional Unix e seus derivados.
Este tutorial, portanto, foi escrito com o intuito de desmitificar essa forte
capacidade dos sistemas operacionais baseados em Unix e de auxiliar
usurios que pouco conhecem este sistema a explorar as inmeras funcionalidades que os Shells oferecem.
Kleber Xavier Sampaio de Souza
Chefe-Geral
Embrapa Informtica Agropecuria
Sumrio
Captulo 1
Shell: Interpretador de Comandos. .....................................................9
A estrutura do Sistema Unix.......................................................................9
O Kernel................................................................................................ 10
O Shell. ................................................................................................. 10
Utilitrios do Unix.................................................................................... 11
Identificando o Shell.................................................................................15
Escolhendo um novo Shell.......................................................................17
O ambiente Shell......................................................................................19
Definindo variveis.................................................................................. 20
Variveis ambientais. .............................................................................. 21
Captulo 2
Um pouco mais do Shell C e do Shell Korn.................................... 29
Os mecanismos de histrico do Shell C e do Shell Korn......................... 29
Como usar o histrico para economizar digitao................................... 32
Como usar os aliases de comandos........................................................34
Como personalizar prompts.....................................................................37
Captulo 3
Programao de scripts de Shell.......................................................39
Definindo variveis...................................................................................39
Operadores..............................................................................................40
Comandos de controle de fluxo................................................................42
if...fi.......................................................................................................42
case...esac............................................................................................. 44
goto.......................................................................................................44
switch...endsw........................................................................................ 45
Expresses de loop..................................................................................46
for...done. .............................................................................................. 47
while...done............................................................................................ 48
Captulo 4
Controle de servio...............................................................................53
Interrompendo servios............................................................................53
Primeiro plano / segundo plano................................................................56
Obtendo informaes sobre as tarefas que esto sendo
executadas...............................................................................................59
Terminando processos.............................................................................63
Concluso................................................................................................67
Referncias..............................................................................................69
Literatura recomendada.......................................................................69
ulo
t
ap
Shell
Kernel
Hardware
10
O Kernel
O Kernel organiza as tarefas do sistema, alm de administrar o armazenamento e transporte de dados. Ele o crebro do sistema Unix, controlando o hardware e dispositivos do computador quando um comando os
solicita. Por exemplo, quando voc digita um comando como cat arq1.txt,
o Kernel ir direcionar o computador para a leitura do arquivo arq1.txt no
disco e, logo em seguida, exibi-lo na tela.
Todos os sistemas operacionais possuem um Kernel, claro que devem ter
outros nomes, mas com funes semelhantes. Em seguida, lista-se um
resumo das funes do Kernel:
Estabelece o sistema de arquivos Unix, organizando e gerenciando o
armazenamento de dados;
Em relao segurana, impede que usurios desautorizados acessem
informaes protegidas;
Executa pedidos de entrada e sada, isto , transfere dados de/para
dispositivos de I/O (Entrada/Sada);
Coordena vrias funes internas do sistema operacional, como a alocao de memria e de outros recursos do sistema, para processos que
esto sendo executados em um determinado momento.
Garante que muitos programas ou aplicaes possam rodar ao mesmo
tempo sem que interfiram uns com os outros, pelo fato de o Unix ser um
sistema multiusurio e multitarefa.
O Shell
J em relao ao Shell, ele o programa que interpreta os comandos digitados por um usurio. uma parte do sistema operacional que funciona
como um agente de ligao entre os comandos que a pessoa digita e as
atividades (funes) que o Kernel deve realizar. No momento em que uma
pessoa digita um comando, o Shell ir traduzir o nome daquele comando
em linguagem de mquina, ou melhor, num conjunto de chamadas em
linguagem de mquina, possibilitando ao Kernel realizar suas tarefas.
Nota-se, ento, que cada comando no Unix nada mais do que um nome
fcil de se lembrar, sendo que esse nome de comando est ligado a um
conjunto especfico de chamadas do sistema.
O objetivo do Shell deixar o sistema operacional mais amigvel, ou seja,
fazer com que o usurio, ao invs de se lembrar de um conjunto complicado de chamadas de sistema, lembre-se apenas do nome do comando.
bom ressaltar que a grande maioria dos sistemas Unix possuem mais de
um Shell, e esses Shells sero vistos e discutidos mais adiante.
Utilitrios do Unix
Na camada mais externa da estrutura do Unix esto os Utilitrios
(Ferramentas e Aplicativos), que so programas pr-determinados a
realizarem funes (tarefas) especficas. Dentro da variedade de sistemas
operacionais Unix, existem muitos Utilitrios, nem todos esto disponveis
em determinados sistemas.
Um usurio pode realizar muitas tarefas com esses utilitrios, como:
clculos aritmticos, redirecionamento de sada para impressoras, desenvolvimento de programas, edio de um texto, canalizao de comandos,
etc.
O nmero de Utilitrios dentro da famlia de sistemas operacionais Unix
imenso, e, alm dessa grande variedade de aplicativos, h a possibilidade
de combinao de comandos usando os pipelines (cujo smbolo |), permitindo ao usurio obter um resultado de acordo com sua necessidade ou
mais prximo dela e, tambm, de um modo mais rpido.
11
12
O Shell Bourne
O precursor de todos esses shells existentes no mercado foi escrito por
Ken Thompson, dos Laboratrios Bell da AT&T, por volta de 1979, como
parte do projeto que envolvia o sistema de arquivos do Unix. Este ainda
era complicado de se trabalhar. No entanto, depois de algum tempo,
um outro componente da AT&T, Steven Bourne, se voltou para o shell
escrito por Thompson e comeou a modific-lo e expandi-lo. A partir da,
o Unix teve um rpido crescimento e foi largamente distribudo entre
instituies comerciais e universidades, e o sh ficou conhecido como o
Shell Bourne. Este shell possui algumas caractersticas peculiares, pois
mais usado, principalmente hoje, para escrever scripts do que como
um shell de comando e, est presente em praticamente todos os sistemas Unix existentes atualmente, alm de possuir muitas variantes de
shell baseadas nele.
O Shell C
Um dos mais importantes (se no o mais) shell do Unix, o Shell C. Ele foi
projetado por Bill Joy, da Universidade da Califrnia, em Berkeley. Quando
estava desenvolvendo o editor de texto vi em linguagem C, Joy, admirador
dessa linguagem, decidiu tambm criar um shell de comando que tivesse
e compartilhasse muitas das estruturas da linguagem C, e que permitisse
escrever scripts de shell mais poderosos e requintados, cujo nome ficou
conhecido como Shell C ou csh. Neste shell, ele implementou algumas
novidades em relao ao Shell Bourne, como:
O Shell Korn
O Shell Korn, ksh, foi desenhado como sendo uma extenso do Shell
Bourne, com alguns recursos do Shell C, como aliases de comando
(entretanto, num formato ligeiramente diferente), histricos de comando e
controles de servio. Ele foi desenvolvido por David Korn dos Laboratrios
Bell da AT&T, no ano de 1982, com maiores aperfeioamentos realizados
em 1986, 1988 e 1993. O Shell Korn est incluso de forma padro, no
Unix System V Release 4 e alguns outros sistemas, alm de poder ser
adquirido separadamente. Algumas propriedades desse shell so descritas abaixo:
Edio interativa de linha de comando, inclusive com histrico de comando.
Habilidade para extrair a parte de uma string especificada por um padro, ou seja, pode-se procurar uma (ou algumas) determinada (s) palavra (s) dentro de um arquivo fornecendo ao sistema (com o Shell Korn) a
descrio da palavra ou parte dela.
Facilidade de se mover entre um diretrio e outro, etc.
O Shell Korn est, cada vez mais, tornando-se popular. Com os recursos
que possui, est se transformando numa alternativa para o Shell C.
13
14
Identificando o Shell
H muitas formas de se identificar o shell que se est usando. A primeira
delas e, talvez a mais fcil, entrar no arquivo etc/passwd (sendo que etc
um subdiretrio do diretrio raiz e passwd um arquivo pertencente ao
15
16
diretrio etc) e ver o que est presente em sua conta. Veja o exemplo que
se segue:
Exemplo:
[fabio@hobbes /]$ tail -8 etc/passwd
bene:5VgR1rD9qxT2w:500:500:Benedito Aparecido Cruz:/home/staff/bene:/bin/bash
kleber:bUXQIdilUbxiE:502:502::/home/staff/kleber:/bin/bash
rosa::503:503:Rosa Cristina Martins de Medeiros:/home/staff/rosa:/bin/bash
gonzal:1hI2zJUNyJdjE:504:504:Carlos Gustavo Gonzales,,,,:/home/staff/gonzal:/
bin/bash
rossano::505:505:Rossano Pablo Pinto,,,,:/home/staff/rossano:/bin/bash
brito::506:506:Antonio Brito,,,,:/home/staff/brito:/bin/bash
fabio:b.NlENts7oItc:501:501:Fabio Danilo Vieira:/home/staff/fabio:/bin/bash
joao:afltY24Vk/.xM:507:507:Joao da Silva:/home/staff/joao:/bin/bash
Exemplo:
[fabio@hobbes /]$ awk F: { if ($1 == fabio) print seu shell : $7 } < /etc/
passwd
seu shell : /bin/bash
Dec 23
Sep 3
1996 /bin/ash*
1996 /bin/bash*
17
18
lrwxrwxrwx
-rwxr-xr-x
lrwxrwxrwx
-rwxr-xr-x
1 root
1 root
1 root
1 root
root
root
root
root
3
105356
4
233732
Aug 27
Aug 12
Aug 27
Dec 18
Exemplo:
[fabio@hobbes fabio]$ cat /etc/shells
/bin/ash*
/bin/bash*
/bin/bsh -> ash*
/bin/csh*
/bin/sh -> bash*
/bin/tcsh*
Sabendo, ento, os nomes dos shells vlidos, pode-se alterar com preciso o shell:
Exemplo:
[fabio@hobbes fabio]$ chsh
Changing login shell for fabio
Old shell: /bin/bash
New shell: /bin/csh
Novo Prompt
[fabio@hobbes]$
O ambiente Shell
O ambiente um espao na memria onde se pode colocar definies de
variveis do shell para que elas fiquem acessveis a qualquer programa
que for executado. Se no colocar a definio de uma varivel no ambiente, apenas o shell ir conhecer o valor de tal varivel.
A insero da definio de uma varivel no ambiente feita em 2 etapas:
na primeira define-se a varivel do shell e, na segunda, se coloca-se a definio no ambiente Unix. Depois ela ser chamada de varivel ambiental
(e continua sendo uma varivel do shell).
Portanto, o shell o principal programa interessado no ambiente, pois nele
so armazenados os valores de algumas de suas relativas variveis. Por
19
20
Definindo variveis
A definio de uma varivel varia de shell para shell e, por este motivo,
ser mostrado como definir variveis apenas nos dois principais shells:
Shell Bourne e Shell C. Mas, os modos de como definir variveis destes
shells podem ser iguais a outros, principalmente em suas variantes.
Para se definir uma varivel para o Shell Bourne e para o Shell C, usam-se
as seguintes sintaxes de linhas de comandos:
$ variavel=valor
% set variavel=valor
(Shell Bourne)
(Shell C)
No Shell C:
% set usuario=Jose da Silva
No Shell Bourne:
$ PATH=:/bin:/usr/bin
No Shell C:
% set PATH=:/bin:/usr/bin
No Shell Bourne:
$ arq1=/bin/vi arq2=/usr/bin/gnuemacs
No Shell C:
% set arq1=/bin/vi arq2=/usr/bin/gnuemacs
Variveis ambientais
Depois que se definem as variveis para o shell pode-se transform-las em
variveis ambientais.
Obs: em Shell C, define-se uma varivel que se transforma em varivel
ambiental com apenas um comando, o qual ser visto frente.
As variveis ficam disponveis a cada processo de programa assim que
sua execuo comea. Um processo poder ou no usar a informao
guardada na varivel ambiental. Portanto, as informaes ambientais
21
22
Sendo assim, a definio de uma varivel ambiental do Shell Bourne consiste em duas etapas:
A criao
Exportao da varivel
Como exemplo, ir se definir a varivel do prompt do Shell Bourne, PS1, e
coloc-la no ambiente.
Exemplo:
$ PS1=Aguardando ordem; export PS1
Aguardando ordem _
Para o Shell C, tem-se a possibilidade de definir e acrescentar uma varivel no ambiente em apenas uma etapa, usando o comando setenv. Veja a
sintaxe:
% setenv variavel valor
Note que ele ficou igual ao prompt padro do Shell Bourne, mesmo estando no Shell C. Portanto, quando for se identificar o shell em uso, a con-
23
24
No Shell C:
% setenv MORE s (atribui um valor varivel e exporta-na para o ambiente)
SHELL=/bin/bash
PS1=[\u@\h \W]\$
USER=fabio
OSTYPE=Linux
SHLVL=1
_=/usr/bin/env
Nesse exemplo, verifica-se que aparecem algumas variveis desconhecidas, mas que no tm muita importncia em relao configurao necessria para o sistema funcionar adequadamente, comportando-se apenas
como opes do prprio usurio ou administrador do sistema.
25
26
Exemplo 2:
% cat .login
# @(#) $Revision: 62.2 $
setenv TERM vt100
stty erase ^h kill ^u intr ^c eof ^d
stty crtbs crterase
# variveis do shell
set history=100 savehist=50
# define algumas variveis de ambiente globais...
setenv EXINIT : set ignorecase
setenv NAME Dave Taylor
Exemplo 3:
% cat .cshrc
# .cshrc
27
28
lo 2
tu
ap
Depois que a varivel history estiver definida, toda vez que o comando
history for chamado, ele ir consultar essa varivel e o valor de n atribudo
a ela, para com isso poder exibir a quantidade de comandos desejada pelo
usurio. Caso aparea uma quantidade menor, porque no foi utilizado
um nmero suficiente de comandos para atingir o valor de n.
Observe que essa varivel no foi transportada para o ambiente, isso
porque um tipo de varivel que s o Shell C pode reconhecer, portanto,
ela no necessita ser definida no ambiente, mas precisa ser definida para
o Shell C.
30
821
1024
1024
3959
95
1024
Mar 4
Mar 7
Mar 4
Mar 7
Mar 6
Mar 6
Mar 4
23:34
16:08
20:41
08:13
16:45
16:45
20:34
tcsh.1
mbox
novell/
ocultos/
prog*
prog.c
public/
-rw-rw-r--
-rw-rw-r--
-rw-rw-r--
-rw-rw-r--
-rw-rw-r--
1 fabio
1 fabio
1 fabio
1 fabio
1 fabio
fabio
fabio
fabio
fabio
fabio
[fabio@hobbes]$ wc prog.c
11
15
95 prog.c
[fabio@hobbes]$ date
Sat Mar 7 18:09:39 EST 1998
493265
250862
250862
48
85
Mar 4
Mar 5
Mar 5
Mar 4
Mar 6
23:35
00:13
00:09
20:28
16:03
tcsh.lj
tcsh.lt1
tcsh.txt
testfile
who.out
31
32
Em relao ao Shell Korn, no se precisa fazer alteraes em seus arquivos de inicializao, pois o comando history est pronto para ser usado
imediatamente.
set history=1000
history
cat arq.txt
ls
33
34
5 15:14 date
6 15:14 history
O equivalente no ksh r.
Pode-se usar centenas de exemplos desses comandos de histrico, mas
os que foram dados e a explicao feita so suficientes para se utilizar
plenamente o recurso de histrico de comandos. A tabela 1 a seguir exibe
os comandos de histrico do Shell C:
Tabela 1. Comandos de histrico do Shell C.
Comando
Funo
!!
!$
!*
^a^b
!n
prog.c
public/
tcsh.1
tcsh.lj
testfile vin@
who.out
tcsh.1
tcsh.lj
testfile vin@
who.out
35
36
% alias DIR ls lF
% alias REN mv
% alias COPY cp i
% alias DEL rm i
Exemplos de algumas
aliases.
setenv PATH=.:/usr/sbin:/sbin:$PATH
set prompt=\[`id -nu`@`hostname -s`\]\#\
37
38
4. Outra maneira de se fazer com que o prompt tenha uma utilidade maior
defini-lo de modo que ele informe o nome do computador atual, o
nome do diretrio de trabalho no momento e o nmero do comando
atual. Observe: (exemplo tirado do livro Aprenda em 24 horas Unix)
%set prompt= $system($cwd:t)(\!)%
limbo(taylor)(26)% _
A varivel cwd com a opo :t informa somente o nome do diretrio atual, e no seu caminho inteiro, diminuindo um pouco mais o tamanho do
prompt. No Shell Korn s trocaria set prompt por PS1.
Logo a seguir, so resumidos, numa tabela, os valores especiais para o
prompt do sistema (tabela retirada do livro Aprenda em 24 horas Unix):
Valor
Resultado
cwd
\!
$var
O valor de var.
^a^b
ulo
t
ap
Definindo variveis
A definio de uma varivel dentro dos scripts se d da mesma maneira
que se faz na linha de comando, ou seja, quando se atribui um valor qualquer a uma determinada palavra, esta se torna uma varivel (em alguns
casos dentro do script, porm, com o uso de certos comandos, a definio
de uma varivel se d com o uso de tais comandos, como por exemplo,
com o comando read, que ser visto mais frente). Por exemplo, no Shell
C, para se definir uma varivel, como j se sabe, usa-se a seguinte linha
de comando:
40
% set var=valor
Outro modo comum de se fazer atribuio de variveis a partir de argumentos da linha de comando. O shell possui variveis especficas para
acess-la, as quais possuem a forma $?, sendo que? vai de 1 a 9. Observe
o exemplo a seguir, que j considera a existncia de um script de soma:
% script_soma 50 100
Operadores
Dentro dos programas-scripts, pode se necessitar de determinadas operaes para se gerar um ou mais resultados, como fazer comparaes de
variveis, adicionar valores s variveis, etc.
Logo a seguir esto relacionados alguns operadores comumente usados
para escrever scripts de shell. Muitos deles j esto presentes em algumas
linguagens de programao.
Operadores de comparao usados pelo csh, sh e ksh (e suas variantes):
z-gt maior que
-lt menor que
-eq igual a
-o ou
Operadores de comparao usados somente pelo csh
!=
=
==
!
&&
!!
>
<
>=
<=
diferente
atribui valor
igual a
negao booleana
e booleano
ou booleano
maior que
menor que
maior igual
menor igual
adio
subtrao
soma 1
mdulo
multiplicao
diviso
decrementa 1
41
42
if...fi
O if o controle de fluxo mais utilizado na programao de scripts, e tem a
seguinte forma:
if
bloco-de-comandos
then
bloco-de-comandos
fi
[ $var -gt 0 ]
then
echo $var maior que zero
fi
Exemplo 2:
file=arquivo.txt
# file recebe o nome do arq. arquivo.txt
if
[ -f $file ]
then
echo $file um arquivo regular
fi
43
44
case...esac
Quando se usa o if e nele h muitas ramificaes (elif), o cdigo ficar
um pouco confuso, e nesse momento que o uso do comando case se
encaixa. Observe sua sintaxe, que um pouco mais complicada que a do
comando if, mas ainda compreensvel:
case varivel in
padro 1) bloco-de-comandos;;
padro 2) bloco-de-comandos;;
...
esac
goto
O comando goto desvia o fluxo de execuo para um ponto especfico
(label) de um script. Os nomes dos labels so sucedidos por dois pontos e
devem aparecer sozinhos na linha.
switch...endsw
O comando switch possui uma sintaxe semelhante do comando case,
s que em vez de executar um bloco de comandos, direciona o fluxo de
execuo para um label do script, sendo que esse label est relacionado
a uma determinada condio do switch. Dentro deste, existe o comando
breaksw, que direciona o controle para o comando seguinte, ao fim do
switch (endsw) . Caso no haja nenhum label correspondente condio
especificada, o controle transferido para o label default, se estiver definido, seno a execuo continua aps o comando endsw. Veja uma exemplo de script com o controle de fluxo switch a seguir:
Exemplo:
echo Opo 1 Somar
echo Opo 2 Sair
read varop
# aguarda entrada de dados para varop
45
46
switch($varop)
case 1:
soma
breaksw
case 2:
breaksw
default:
echo Digite opo vlida
endsw
exit
soma:
read varnum1
read varnum2
echo O valor da soma :
expr $varnum1 + $varnum2 # faz a soma das variveis
)
No exemplo dado, primeiramente se l a varivel varop. Logo aps, o comando switch avalia o valor de tal varivel. Caso seja 1, ser chamado o
label soma, que ir ler (atravs do comando read) duas variveis e fazer a
soma delas atravs do comando expr (que ser comentado mais frente).
Caso varop seja 2, o controle de execuo ser direcionado para o comando exit, e se varop no possuir nenhum dos dois valores, ser executado o
label default, o qual emitir uma mensagem de opo invlida.
Expresses de loop
De vez em quando, aparecem programas em que h a necessidade de
se executar vrias vezes um mesmo conjunto de comandos e, em vez de
escrev-los vrias vezes, utilizam-se os comandos de loop (ou de laos).
E na programao, em geral, h dois tipos de loop: o determinado e o
indeterminado.
Um loop determinado aquele em que se sabe o valor exato de quantas
vezes ir se executar os comandos, antes mesmo de se inseri-lo o loop. J
o indeterminado aquele em que necessrio se executar um conjunto de
comandos at que uma determinada condio no seja mais verdadeira.
Logo a seguir, sero explicados os comandos de loop mais usados nos
scripts de shell, que so o for...done e o while...done.
for...done
O comando voltado para um loop determinado nos scripts de shell o
comando for. Outras linguagens de programao (pelo menos a maioria
delas), possuem esse comando. Sua sintaxe para o uso em scripts tem a
seguinte forma:
for var-in-list
do
bloco-de-comandos
done
Nos scripts de shell, esse comando bastante utilizado para listas de arquivos, sendo bastante eficiente, pois essas listas, geralmente, so extensas. Veja um exemplo com o comando de loop for numa determinada lista
de arquivos de um diretrio:
Exemplo:
for var in ls
do
if
[ -f $var ]
then
echo $var um arquivo regular
fi
done
Nesse exemplo, a sada fornece uma lista com todos os arquivos regulares, sendo que var a varivel que ir ser usada dentro do loop e que ir
fornecer o nome de cada arquivo regular da lista. Vale observar que a lista
utilizada para se fazer tal pesquisa obtida de uma comando ls no diretrio corrente.
Se a parte in list for omitida do comando for, ele ir percorrer a lista de
argumentos da linha de comando. Veja o exemplo:
Exemplo:
j=0
for i # a varivel i definida dentro do lao for
do
j=expr $j + 1
# faz a soma de j=j+1
echo $i o argumento $j
done
47
48
while...done
No item anterior, quando se usou o comando for, j se sabia o nmero de
vezes que um bloco de comandos seria executado. Mas, existem casos em
que se precisa executar blocos de comandos at que algo acontea, e a
que o comando while se encaixa. A sintaxe do comando while a seguinte:
while condio
do
bloco-de-comandos
done
Um exemplo de loop indeterminado quando se est esperando a chegada de um arquivo em seu diretrio, mas no se sabe quando poder
chegar. Esse arquivo pode ser enviado pelo servidor ou por outro usurio
que tenha permisso para gravar dados em sua rea.
Com o uso do loop while, pode-se resolver essa situao. Dentro da condio, aps o comando while, faz-se uma verificao se o primeiro arquivo
mais recente que o segundo; se for, aguarda-se mais 60 segundos e
faz-se outra verificao. O primeiro arquivo, nesse caso, seria um arquivo
qualquer de seu diretrio, que seria usado apenas como ponto de verificao com o segundo arquivo, aquele o arquivo que se est aguardando
chegar em seu diretrio. Para se fazer tal verificao, usa-se o flag nt,
que retorna verdadeiro se o primeiro arquivo for mais recente que o segundo. Veja como ficaria em termos de programao:
while
do
done
# aguarda 60 segundos
Exemplo:
# este script conta de 20 a 1
var_num=20
while
[ $var_num -gt 0 ]
do
echo $var_num
expr $var_num 1
done
# subtrai 1 de var_num
Essa sequncia anterior ser executada 19 vezes, exibindo o valor da varivel var_num na tela enquanto tal varivel for maior que zero.
clear
O comando clear limpa o contedo da tela e posiciona o cursor no canto
superior esquerdo do monitor. Ele um dos comandos mais usados nos
scripts, principalmente no incio de cada um, pois assim, a tela anterior
apagada e s o resultado do script exibido.
echo
O comando echo, que j foi explicado e muito usado anteriormente, exibe
strings ou contedo de variveis de memria na tela. Quando for exibir o
contedo de variveis, utiliza-se o smbolo $ antes delas. O comando echo
exibe strings ou contedo de variveis tanto entre aspas como sem aspas.
Veja exemplos:
Exemplos:
49
50
1)
echo $variavel
ou
echo $variavel
2)
echo Isto um teste
ou
echo Isto um teste
exit
O comando exit abandona o fluxo do script, ou seja, ele quebra a sequncia de execuo de script e retorna ao sistema operacional. Todo final de
script deve possuir esse comando.
Quando usado diretamente na linha de comando, ele faz a desconexo do
terminal com o servidor ou, se o usurio estiver usando um subshell, ele
retorna ao shell de login.
expr
O comando expr, que tambm foi muito usado anteriormente, tem como
funo executar uma operao aritmtica numa varivel de memria ou
diretamente em nmeros fornecidos pelo usurio.
Abaixo esto listados dois exemplos, sendo que o primeiro executado a
partir da linha de comando e o segundo, dentro de um script qualquer:
Exemplos:
1)
$ expr 3 + 2
5
$_
2)
# script de subtrao
var=10
expr $var 5
adio
multiplicao
resto
subtrao
diviso
read
Antes de mais nada, a sintaxe do comando read a seguinte:
read nome-da-varivel
51
52
sleep
A sintaxe do comando sleep a seguinte:
sleep numero-de-segundos
Esse comando aguarda um determinado tempo em segundos para continuar a execuo normal do script (ou de comandos, caso seja utilizado
a partir da linha de comando). Para quem se lembra, ele foi utilizado no
exemplo da expresso de loop while...done,em que se aguardava intervalos de 60 segundos para a gravao de um arquivo no diretrio do usurio.
E, com a explicao desse ltimo comando, chega-se ao final do captulo
3, que tratou da programao bsica para shell ( vlida tanto para o Shell
C, Shell Bourne, Shell Korn e as variantes desses trs ). Foram tratados e
explicados alguns comandos teis para a programao de scripts, como
os de controle de fluxo (if...fi, goto, etc.), os de loop (for...done, while...
done) e outros auxiliares (clear, exit, expr, etc.), alm do uso de operadores e tratamento de variveis. O principal objetivo desse captulo no foi
mostrar como ser um extraordinrio programador de scripts, mas sim, explicar a finalidade e os fundamentos bsicos de como se trabalhar e utilizar
corretamente os scripts de shell.
ulo
t
ap
Controle de Servio
Interrompendo servios
Como j foi dito, no Unix, qualquer programa que esteja sendo executado
se constitui num processo. No Shell C e no Shell Korn, os processos so
conhecidos tambm como servios, e o programa executado no momento
conhecido como servio atual.
Tanto no Shell C quanto no Shell Korn (ou mesmo nas variantes destes),
para se interromper um processo (ou servio) em execuo, deve-se
pressionar ^z (control + z). Para reiniciar o processo novamente, utiliza-se
o comando fg.
Esse tipo de controle de servio , geralmente, usado para comandos que
geram sadas muito longas, como ls (listar o contedo dos diretrios), cat
(exibem o contedo de um arquivo) e man (exibir uma documentao de
ajuda do comando especificado), alm de outros.
54
LS(1)
NAME
ls, dir, vdir - list contents of directories
SYNOPSIS
ls [-abcdfgiklmnpqrstuxABCFGLNQRSUX1] [-w cols] [-T cols]
[-I pattern] [--all] [--escape] [--directory] [--inode]
[--kilobytes] [--numeric-uid-gid] [--no-group] [--hidecontrol-chars] [--reverse] [--size] [--width=cols] [--tabsize=cols] [--almost-all] [--ignore-backups] [--classify]
[--file-type] [--full-time] [--ignore=pattern] [--dereference] [--literal] [--quote-name] [--recursive]
[--sort={none,time,size,extension}] [--format={long,verbose,commas,across,vertical,single-column}]
[--time={atime,access,use,ctime,status}] [--help] [--version] [--color[={yes,no,tty}]] [--colour[={yes,no,tty}]]
[name...]
DESCRIPTION
This documentation is no longer being maintained and may
--More-- _
No exemplo dado, observa-se que h mais informaes a serem fornecidas sobre o comando ls, pois aparece a palavra more no final da tela (em
alguns sistemas pode aparecer: em vez da palavra more), e no END, que
indica o final da documentao de um comando. Sendo assim, se o usurio quiser terminar a execuo, ele pode pressionar q, e o programa man
ser finalizado, mas, se ao invs disso, ele preferir interromp-lo temporariamente e ver o restante da documentao de ls num outro momento,
pode pressionar ^z. Veja o que acontecer:
% man ls
LS(1)
LS(1)
NAME
ls, dir, vdir - list contents of directories
SYNOPSIS
ls [-abcdfgiklmnpqrstuxABCFGLNQRSUX1] [-w cols] [-T cols]
LS(1)
NAME
ls, dir, vdir - list contents of directories
SYNOPSIS
ls [-abcdfgiklmnpqrstuxABCFGLNQRSUX1] [-w cols] [-T cols]
[-I pattern] [--all] [--escape] [--directory] [--inode]
[--kilobytes] [--numeric-uid-gid] [--no-group] [--hidecontrol-chars] [--reverse] [--size] [--width=cols] [--tabsize=cols] [--almost-all] [--ignore-backups] [--classify]
[--file-type] [--full-time] [--ignore=pattern] [--dereference] [--literal] [--quote-name] [--recursive]
[--sort={none,time,size,extension}] [--format={long,verbose,commas,across,vertical,single-column}]
[--time={atime,access,use,ctime,status}] [--help] [--version] [--color[={yes,no,tty}]] [--colour[={yes,no,tty}]]
[name...]
55
56
DESCRIPTION
This documentation is no longer being maintained and may
--More-- _
A sada a mesma que a anterior, isso porque foi o ponto em que o comando man foi interrompido, e a partir do qual poder continuar. O nome
do comando fg uma abreviao para foreground, que quer dizer primeiro
plano, sendo que primeiro plano uma referncia ao programa com o qual
o monitor e o teclado esto trabalhando.
O nmero que foi mostrado como sada nada mais que o nmero do
processo (no o espao usado do disco) que est sendo executado
e, que nesse caso, 290. A opo s do comando du faz com que ele
exiba apenas o total usado em disco e no o espao ocupado por cada
arquivo e diretrio tambm. J a barra ( / ) faz com que ele pesquise o
disco todo.
Alguns sistemas podem exibir, alm do nmero do processo, o nmero do
controle de servio, que o nmero de ordem dos comandos de controle
de servio. Veja:
Exemplo:
% du s / > arq.du &
[1] 290
%_
57
58
Nota-se que o processo foi interrompido com ^z, pois a palavra Stopped
exibida logo abaixo da linha de comando. J se sabe que, para se trazer
esse processo para ser executado no plano principal, utiliza-se o comando
fg, mas tambm foi dito como lev-lo para o segundo plano, que usando
o comando bg. Veja o exemplo abaixo:
Exemplo:
% bg
[2] du s / > arq.du
%_
Pelo exemplo, pode se ver que o comando bg exibe, como sada, o nmero do controle de servio entre colchetes (n 2) mais a linha de comando
que foi interrompida e ser executada em segundo plano. Em alguns sistemas esse nmero de controle de servio pode ser trocado pelo nmero do
processo.
LS(1)
NAME
ls, dir, vdir - list contents of directories
SYNOPSIS
ls [-abcdfgiklmnpqrstuxABCFGLNQRSUX1] [-w cols] [-T cols]
[-I pattern] [--all] [--escape] [--directory] [--inode]
[--kilobytes] [--numeric-uid-gid] [--no-group] [--hidecontrol-chars] [--reverse] [--size] [--width=cols] [--tabsize=cols] [--almost-all] [--ignore-backups] [--classify]
[--file-type] [--full-time] [--ignore=pattern] [--dereference] [--literal] [--quote-name] [--recursive]
[--sort={none,time,size,extension}] [--format={long,verbose,commas,across,vertical,single-column}]
[--time={atime,access,use,ctime,status}] [--help] [--version] [--color[={yes,no,tty}]] [--colour[={yes,no,tty}]]
[name...]
59
60
DESCRIPTION
This documentation is no longer being maintained and may
--More-- _
Stopped
%_
Exemplo 2:
% cat prog.c
#include <stdio.h>
main()
{
int i;
for ( i=0; i<=4; i++ )
printf(Nmero: %d, i+1);
return;
}
%_
Significado
Executando
Interrompido
61
62
man ls
du s / > arq.du
LS(1)
NAME
ls, dir, vdir - list contents of directories
SYNOPSIS
ls [-abcdfgiklmnpqrstuxABCFGLNQRSUX1] [-w cols] [-T cols]
[-I pattern] [--all] [--escape] [--directory] [--inode]
[--kilobytes] [--numeric-uid-gid] [--no-group] [--hidecontrol-chars] [--reverse] [--size] [--width=cols] [--tabsize=cols] [--almost-all] [--ignore-backups] [--classify]
[--file-type] [--full-time] [--ignore=pattern] [--dereference] [--literal] [--quote-name] [--recursive]
[--sort={none,time,size,extension}] [--format={long,verbose,commas,across,vertical,single-column}]
[--time={atime,access,use,ctime,status}] [--help] [--version] [--color[={yes,no,tty}]] [--colour[={yes,no,tty}]]
[name...]
DESCRIPTION
This documentation is no longer being maintained and may
--More-- _
% fg 660
du s / > arq.du
man ls
du s / > arq.du
mesma sada que o fg 652
mesma sada que o fg 660
Terminando processos
Nos itens anteriores, foi explicado como trabalhar com processos interrompidos e em segundo plano e tambm como visualizar o estado em que
estavam. Neste item, ser abordado um comando para finalizar tais processos, ou seja, interromp-los definitivamente. Esse comando o kill, e
sua sintaxe bem simples:
kill numero-do-processo
ou
kill %numero-do-controle-de-servio
63
64
A necessidade de se utilizar esse comando pode aparecer em diversas situaes, como no caso do usurio descobrir que um processo, em segundo plano, no est sendo executado corretamente ou no caso do sistema
estar muito lento, por existir muitos processos interrompidos e outros em
segundo plano.
Observe um exemplo simples abaixo, em que criado um processo em
segundo plano e depois ele terminado:
Exemplo:
% man sort > sort.txt &
[1] 450
% kill 450
%_
ou
% kill %1
%_
Nesse exemplo, pedido ao comando man para fornecer uma documentao do comando sort, com a sada redirecionada para o arquivo sort.txt,
sendo todo processo executado em segundo plano. Feito isso, exibido o
nmero do controle de servio mais o nmero do processo (lembrando que
alguns sistemas podem listar somente o nmero do processo). Logo aps,
utiliza-se o comando kill para encerrar tal processo e, como parmetro,
pode ser passado tanto o nmero do controle de servio (com o sinal %
acompanhado) quanto o nmero do processo, que, nesse caso so, respectivamente, 1 e 450. Em alguns sistemas seria mostrada a mensagem
450:Terminated (450 Terminado), mas em outros, nenhuma mensagem
exibida, devendo-se, ento, usar os comandos ps ou jobs para saber
se o processo realmente foi terminado. Usando o ps para verificar se os
processos anteriores foram encerrados, obtm-se:
% ps
PID TTY STAT TIME COMMAND
405 P0
S
0:00 csh
700 P0
R
0:00 ps
Pela sada de ps, pode-se confirmar que o processo realmente foi encerrado.
possvel, tambm, ocorrer a necessidade do usurio querer se lembrar
do nmero do processo ou do controle de servio para finalizar um deter-
man ls
du s / > arq.du
65
66
O captulo 4 est, por aqui, finalizado. Nele foi discutido sobre um dos melhores recursos do Unix, que o controle de servio, presente nos shells
C e Korn, alm de algumas variantes destes e em shells mais recentes.
Com os comandos de controle de servio, como foi explicado, possvel
se interromper a execuo de comandos (processos), inserir processos em
segundo plano, visualizar os estados dos processos ou mesmo encerrar
processos interrompidos ou em segundo plano.
Concluso
A estrutura do sistema operacional Unix dividida em 3 partes: o Kernel,
o Shell e os Utilitrios. A nfase deste trabalho dada ao Shell, que o
interpretador de comandos do Unix.
No Unix existem vrios shells, sendo que cada um deles possui caractersticas pertinentes e que os diferem uns dos outros. No obstante, um shell
tambm pode ter caractersticas que outros shells possuem. Os shells
mais importantes do Unix so o Shell C (csh), Shell Bourne (sh) e o Shell
Korn (ksh). Para se identificar o shell em uso, pode-se utilizar vrias tcnicas, sendo que uma delas a linha de comando ps | grep $$. J para se
mudar o shell de login, ou seja, o shell padro de quando se inicia o sistema, digita-se o comando chsh. No caso do usurio querer apenas alterar,
momentaneamente, de um shell para outro, digita-se somente o nome do
novo shell. Os shells do Unix, como o csh e o sh, tambm possuem variveis que servem para configurar o ambiente com o qual eles iro trabalhar,
alm de permitir a criao e a definio de outras pelo usurio. Essas variveis tambm podem ser inseridas nos arquivos de inicializao de shell,
nos quais pode-se estabelecer um ambiente inicial toda vez que se entrar
no sistema.
Alguns shells, como os Shells C e Korn possuem alguns recursos interessantes em relao aos outros shells. Esses recursos so: o mecanismo
de histrico de comandos, os aliases de comandos e a configurao de
prompts personalizados. Com o mecanismo de histrico de comandos,
possvel se lembrar de um programa anteriormente usado no sistema,
digitando-se apenas alguns comandos curtos. Entre esses comandos est
o !!, que executa o ltimo programa utilizado. No entanto, no csh, para que
esse mecanismo funcione bem, preciso, antes, que a varivel history
esteja definida com o nmero de comandos que devero ser lembrados
para uma eventual execuo de um comando de histrico. Com os aliases
possvel dar pseudnimos a comandos (ou sequncia de comandos)
que oferecem uma certa dificuldade para o usurio, seja essa dificuldade
de digitao ou de execuo. Com esse recurso, pode-se dar nomes bem
curtos para linhas de comandos muito extensas. J o recurso de configurao de prompts permite ao usurio configurar o prompt de acordo com sua
67
68
Referncias
TAYLOR, D.; ARMSTRONG JNIOR, J.C. Aprenda em 24 horas UNIX. Rio de Janeiro : Ed.
Campus, 1998. 672 p.
Literatura recomendada
ABRAHAMS, P.W.; LARSON, B.R. Unix for the impatient. 2nd ed. Reading : Addison-Wesley,
1996. 824 p.
ANUNCIAO, H. Unix para redes brasileiras. So Paulo : Ed. rica, 1997. 196 p.
BOURNE, S.R. The Unix System V environment. Wokingham : Addison-Wesley, 1987. 378 p.
THOMAS, R.; YATES, J. Unix total. So Paulo : Ed. McGraw-Hill, 1988. 744 p.
69