UNIVERSIDADE FEDERAL DO PARÁ
CENTRO DE CIÊNCIAS EXATAS E NATURAIS
DEPARTAMENTO DE INFORMÁTICA
CURSO: UNIX BÁSICO
OBJETIVOS: Apresentar conhecimentos que iniciem o aluno na utilização do
sistema operacional UNIX (IBM AIX Version 3). Apresentar suas
principais características, componentes e comandos básicos.
CARGA HORÁRIA: 20 horas
PREPARAÇÃO: Prof. Mário José Matos Tavares - DI - UFPA
PROGRAMA:
1. Histórico
2. Principais características
3. Comandos iniciais
login / logout
passwd
ls
date
cat
wc
who
man
mail
4. Manipulação de arquivos
Arquivos ordinários
Diretórios
Arquivos especiais
Nomes
Caminhos ou vias
Comandos para manipulação de diretórios
Proteção
Movimento e mudança de nome
Cópia
Eliminação
5. Processos
Características
Processos do sistema
Controle e monitoração
6. Shells
Características
Redireção
Canalização e filtros
Metacaracteres e coringas
7. O editor "vi"
Características
Movimento do cursor
Criação, saída e gravação
Inserção e deleção
Pesquisa e troca de "strings"
Cópia e transferência de linhas
Desfazendo erros
Customização de ambiente
8. Utilitários e ferramentas
find
grep
cut
paste
9. Conclusões
***************************************************
1. Histórico
O sistema UNIX fornece essencialmente os mesmos serviços que são
oferecidos por outros sistemas operacionais: ele permite rodar programas,
fornece uma interface conveniente e consistente a uma grande variedade de
dispositivos periféricos (impressoras, fitas, discos, terminais, etc.) que são
conectados à maioria dos computadores, e fornece um sistema de arquivos para
o gerenciamento de informações. A exclusividade do UNIX é em grande parte
devida à maneira como foi feito. Podemos entender melhor a crescente
popularidade deste sistema adotando uma perspectiva histórica.
Parte da popularidade do sistema UNIX é atribuída a sua portabilidade,
flexibilidade e elegância. Ironicamente, o UNIX emergiu do sótão de uma das
mais sólidas corporações do mundo: a Bell Laboratories, o braço subsidiário de
pesquisas da AT&T. A maioria dos sistemas operacionais foi desenvolvido por
fabricantes de computadores para venderem computadores. Considerando que a
AT&T não estava no negócio de vendas de computadores, o UNIX não foi
originalmente concebido como um produto comercial. Ele somente se tornou um
empreendimento comercial em resposta à grande demanda que se desenvolveu.
No final dos anos 60, a Bell Labs estava envolvida com um sistema
operacional chamado Multics. O Multics é um sistema interativo de múltiplos
usuários que utiliza uma CPU de computador GE. A Bell Labs retirou-se do projeto
Multics em 1969, mas o Multics teve importante influência no UNIX. Na verdade,
o nome UNIX teve uma relação com a palavra Multics. Uma das diferenças
determinantes entre o UNIX e o Multics é a complexidade - o sistema
operacional UNIX é relativamente simples enquanto que o Multics é
extremamente complexo.
Mais ou menos no mesmo momento em que a Bell se retirou do projeto
Multics, Ken Thompson, o "vovô do UNIX", começou a "consertar" um
microcomputador rejeitado, da Digital Equipment Corporation, o PDP-7.
Ostensivamente, Thompson desejava criar um sistema operacional que pudesse
apoiar os esforços coordenados de um time de programadores num ambiente de
pesquisa de programação. Este objetivo foi alcançado com sucesso. Também
com o objetivo de apaziguar a gerência, Thompson propôs que os próximos
desenvolvimentos do UNIX fossem apoiados pela Bell para fornecer uma
ferramenta de preparação de documento à organização de patentes da
companhia. Uma versão primitiva do UNIX que utilizava um PDP-11/20 foi
entregue à organização de patentes da Bell Laboratories em 1971.
Bem no início, duas disciplinas aparentemente incompatíveis,
programação e preparação de documentos, foram as pedras fundamentais do
UNIX. Na prática, o UNIX demonstrou que ferramentas de gerenciamento de
texto são centrais para muitas disciplinas, inclusive programação. As pessoas
têm criticado o UNIX por ele ser apenas um processador de palavras. Enquanto
há aplicações que necessitam de sistema operacionais que não o UNIX, o
enfoque em manipulação de textos serviu para torná-lo um sistema operacional
extremamente versátil. O texto é um meio de comunicação aceito
universalmente, uma característica chave para um sistema operacional
interativo de propósito geral.
Os esforços originais de Ken Thompson culminaram na criação de um
sistema operacional, um PDP-7 montador, e vários programas utilitários em
linguagem de montagem. Em 1973, Dennis Ritchie reescreveu o UNIX na
linguagem de programação C. C é uma linguagem de programação de alto nível,
de propósito geral, que foi desenvolvida por Ritchie. Ela provou ser adaptável a
muitos tipos diferentes de arquitetura de computador. Se o UNIX não tivesse
sido reescrito em uma linguagem de baixo nível, ele teria sido acorrentado à
máquina (o obsoleto PDP-7) na qual foi desenvolvido. Uma vez que os programas
em linguagem de montagem originais também haviam sido escritos na
linguagem C, repentinamente foi possível transportar todo o UNIX de um
ambiente para o outro com o mínimo de dificuldade.
Sistemas operacionais têm sido tradicionalmente ligados a um
computador ou a uma família de computadores porque eles foram escritos em
linguagem de montagem. Apesar do UNIX não ter sido originalmente destinado
a ser um sistema operacional portátil, uma vez ter sido codificado em C, tudo
estava em ordem para transportá-lo para outros sistemas. O primeiro transporte
para um tipo diferente de computador foi conseguido por Ritchie e Stephen
Johnson em 1976, quando eles transportaram o UNIX para o Interdata 8/32.
Desde então, o UNIX já foi transportado para uma dúzia ou mais de arquiteturas,
variando de microprocessadores de um chip, tais como o Zilog Z-80 e Z-8000, o
Motorola MC 6800 e o Intel 8086, a grandes máquinas como o IBM 370 e o
Amdahl 470 .
Enquanto Thompson ganhava a aceitação de seus colegas e da gerência
durante o início dos anos 70, o UNIX começou a ser utilizado internamente
através da Bell System. E enquanto a fama do sistema operacional se espalhava,
gerava interesse em várias instituições acadêmicas de prestígio. Em 1975, a
Western Electric começou a licenciar o UNIX. A taxa era nominal para
instutuições acadêmicas, encorajando muitas delas a utilizar e posteriormente
desenvolver o UNIX. Porque o UNIX era considerado tão favorável pelas
comunidades acadêmicas de pesquisa de alta tecnologia, ele foi inicialmente
visto com ceticismo pela comunidade comercial. Recentemente, esta
comunidade entendeu a facilidade com que o UNIX pode ser adotado para uma
grande variedade de aplicações. Começando no fim dos anos 70, uma indústria
de UNIX apareceu para fornecer hardware, software e serviços relacionados.
O UNIX foi pioneiro em várias idéias importantes. Uma das mais
importantes inovações é a canalização, que, por sua vez, levou à idéia de que
funções complicadas podem ser programadas como um conjunto de programas
funcionando juntos.
Uma outra idéia que se difundiu no UNIX é a noção de ferramenta de
software. Esta idéia não é exclusiva do UNIX mas certamente se desenvolveu
mais nele do que em outros sistemas. Para simplificar tarefas de programação
envolvendo o reconhecimento de uma linguagem de comando, o UNIX possui o
yacc e o lex. Estes dois programas permitem a um programador implementar um
interpretador de linguagem de comando, descrevendo a linguagem de comando
numa forma tabular em vez de escrever um interpretador exclusivo para a
linguagem. Dois outros exemplos de ferramentas sofisticadas são o Make e o
Source Code Control System (SCCS) - Sistema de Controle de Código Fonte. Make
é utilizado para especificar as interdependências em um sistema de software
para que o sistema possa ser mantido automaticamente. O SCCS é utilizado para
seguir os passos de um sistema de software, através de todo o seu tempo de
vida madura, para que versões antigas possam ser recuperadas e novas versões
possam ser documentadas.
Neste ponto o UNIX parece estar emergindo como um sistema
operacional padrão para uso geral em uma ampla gama de computadores. Não é
possível que ele seja largamente utilizado em situações onde um computador é
usado para um propósito especial utilizando-se de um sistema operacional
especializado (ex: processamento de transações, sistemas de reservas, sistemas
de tempo real).
Um aspecto do futuro do UNIX se relaciona com sua grande aceitação e
uso na comunidade acadêmica computacional. O UNIX tornou-se um padrão
com o qual novos desenvolvimentos de sistemas operacionais são avaliados.
2. Principais características
As principais características do sistema operacional UNIX são:
- arquitetura aberta;
- portabilidade através de diferentes tipos de hardware;
- sistema de arquivos independente dos dispositivos físicos;
- possibilidade de encadear diferentes programas a fim de executar
grandes tarefas;
- projetado para múltiplos usuários executando múltiplas tarefas;
- pouco apropriado para aplicações de tempo real;
- má gerência no caso de vários usuários rodando as mesmas
aplicações.
Estrutura do UNIX
O UNIX é constituído basicamente dos seguintes componentes:
Fig. 1 - Estrutura fundamental do UNIX
O KERNEL (Núcleo do Sistema Operacional)
Certas funções de sistemas operacionais são necessárias muitas vezes a
cada segundo. Por exemplo, a parte do UNIX que se envolve na mudança de um
programa para o outro (tempo compartilhado) é solicitada muitas vezes a cada
segundo. No UNIX todas as funções que são necessárias de imediato são
mantidas constantemente na memória. A parte de um sistema operacional que
fica residente na memória é chamada de núcleo.
Muitas funções do sistema operacional são necessárias apenas
ocasionalmente, tal como a capacidade de transportar alguma informação de um
dispositivo de armazenamento de massa para outro. Estes tipos de funções são
fornecidos por utilitários, programas padrão que são solicitados de acordo com a
demanda dos usuários. No UNIX é fácil incrementar o estoque de utilitários
simplesmente escrevendo um programa novo e útil.
Em muitos sistemas operacionais, o núcleo contém muitas
características. O UNIX tenta dotar o núcleo de características relativamente
novas para que a maioria das funções do sistema operacional possa ser
fornecida por programa utilitários.
O kernel do UNIX é responsável pelo escalonamento de processos,
alocação de espaço em disco, supervisão da transferência de dados entre a
memória e os dipositivos periféricos e resolução das solicitações de serviço dos
usuários. O kernel nunca faz nada diretamente para um usuário; todos os
serviços são fornecidos por programas utilitários que interfaceam os usuários e o
núcleo.
Como vimos na figura 1, o kernel é formado por dois componentes
importantes:
O Controlador de Processos
Responsável pelo escalonamento dos processos, que nada mais são do
que programas em execução num determinado ambiente. Para um dado
programa pode haver zero, um ou vários processos ativos em um determinado
momento. Essa idéia de que os programa têm vida é conveniente e útil, já que
torna mais fácil pensarmos sobre os mesmos e controlá-los corretamente. Cada
vez que um processo é criado, seu fluxo de dados "default" será:
Fig. 2 - Fluxo de dados "default" de um processo
O Sistema de Arquivos
O sistema de arquivos hierárquico é uma das características mais
importantes do sistema UNIX. A função mais básica de qualquer sistema de
arquivos é a de particionar o armazenamento em discos e fitas em unidades
nomeadas que chamamos de arquivos. Em muitos sistemas há vários tipos de
arquivos com métodos de acesso distintos para cada tipo.
No UNIX todos os arquivos são uma sequência simples de bytes. Às
vezes, os arquivos são referidos como arquivos texto ou arquivos binários, mas a
distinção é o conteúdo do arquivo (arquivo de texto contém somente valores
ASCII) e não a estrutura ou o método de acesso ao mesmo.
Do ponto de vista do usuário do sistema, um diretório é um grupo de
arquivos. Em alguns sistemas operacionais (outros que não o UNIX), todos os
arquivos em um volume de armazenamento estão contidos em um diretório.
Ainda outros sistemas de arquivos, particionam o disco em um número de
diretórios e parcelam os arquivos em um dos diretórios. Ambos os métodos
criam um sistema de arquivos plano. Tudo no mesmo nível. Sistemas de
arquivos planos são utilizáveis, mas são confusos porque cada diretório contém
muitos tipos de arquivo.
O UNIX possui um sistema de arquivos hierárquico. Os arquivos não
estão armazenados em um nível mas em níveis múltiplos e o sistema de
arquivos apóia a ilusão de "lugares" dentro do sistema. Em sistemas de arquivos
planos, o diretório é a principal estrutura organizacional do sistema; o diretório
contém todas as informações sobre arquivos, incluindo seus nomes,
comprimentos, posições, datas de acesso, modos e tipos. Porque os diretórios
em sistemas de arquivos planos contêm todas as informações importantes sobre
os arquivos, eles são escondidos e protegidos pelo sistema operacional.
Entretanto, no UNIX os diretórios são apenas arquivos que podem ser lidos por
qualquer programa. Embora o diretório seja a estrutura visível do sistema de
arquivos UNIX, eles não são o depósito de todas as informações sobre os
arquivos. Os diretórios contêm apenas duas partes de informações para cada
arquivo: o nome do arquivo e um número usado pelo núcleo para acessar as
estruturas ocultas do sistema de arquivos.
A parte oculta do sistema de arquivos do UNIX é o inode. Inodes estão
onde a ação realmente acontece no sistema de arquivos UNIX. Há um inode
para cada arquivo. O inode contém informações sobre a posição, o comprimento,
o modo de acesso, as datas relevantes (criação, último acesso, etc.), o
proprietário e similares. O usuário casual do UNIX está bem protegido dos
inodes, ou seja, não precisará manipulá-los.
Na figura abaixo, o sistema de arquivos padrão dos sistemas UNIX:
Fig. 3 - Sistema de arquivos padrão do UNIX
O núcleo do sistema UNIX contém cerca de 10.000 linhas de código C e
cerca de 1.000 linhas de código de montagem. Um programa deste tamanho
pode ser compreendido e mantido por um único indivíduo. Muitos sistemas UNIX
são distribuídos com o código fonte do núcleo e de todos os utilitários. Isto
permite aos programadores (de sistema) estudarem e trabalharem com o seu
próprio sistema.
O Editor e o SHELL
Usuários típicos do UNIX gastam a maioria do seu tempo usando dois
programas: o shell e o editor. Para usar a flexibilidade do UNIX é necessário ter-
se um conhecimento do funcionamento de muitos outros programas, mas grande
parte do seu tempo será provavelmente gasto usando estes dois programas.
O editor padrão do UNIX é um programa interativo, o "vi". O controle do
editor é feito por comandos. Há comandos para imprimir linhas, para acrescentar
e modificar texto de um arquivo. O editor será utilizado para uma larga
variedade de funções, tais como: criar arquivos com mensagens para serem
enviadas eletronicamente, alteração de tabelas do sistema, acesso e
modificação ao "buffer" de comandos digitados pelo usuário.
O shell é um dos programas mais importantes do UNIX. Como o editor, o
shell também é um programa interativo. Pode-se controlar o shell através de
comandos que o mesmo interpreta (decodifica) e executa. Portanto o nome
técnico do shell é interpretador de comandos.
A função de um interpretador de comandos é executar os comandos que
forem inseridos. Por exemplo, se você quiser rodar o programa que mostra a
data e a hora na tela, insira o comando "date" e o shell fará com que este
programa seja executado pelo UNIX.
Em muitos sistemas operacionais o interpretador de comandos é uma
parte da estrutura interna do sistema operacional. No UNIX, entretanto, o shell é
somente um programa comum, semelhante ao programa da data ou a qualquer
outro programa que rode no UNIX. A única característica especial do shell é o
fato de ele ser central à maioria das interações com o UNIX.
Existem vários shells disponíveis para o UNIX, cada um com
características particulares e apropriado para usuários com determinado perfil.
Em UNIX, quase todos os programas são ferramentas simples que
podem ser combinadas com outros programas para produzirem ferramentas
poderosas e, o shell, é a chave para coordenar e combinar programas no UNIX.
3. Comandos iniciais
A partir de agora vamos apresentar os comandos necessários para um
primeiro contato com o UNIX. O formato da maioria dos comandos UNIX é
extenso, com muitas opções, chaves ou switches. Desse modo, de cada comando
só serão apresentadas as chaves e opções necessárias ao aprendizado básico
que é a proposta do presente curso. Essa observação é válida para todos os
comandos vistos neste material.
Outra característica bastante peculiar do UNIX é o fato do mesmo ser
"case-sensitive", ou seja, ele considera diferentes comandos digitados em
maiúsculo ou minúsculo. Portanto, a partir de agora digite sempre seus
comandos com letras minúsculas, salvo consideração em contrário.
login / logout
A primeira coisa que você tem que fazer para usar o UNIX é acessá-lo.
O propósito do acesso ao sistema - login - é duplo: deixar o UNIX verificar seu
direito de utilizar o sistema e preparar o ambiente do usuário. Na maioria dos
sistemas operacionais de um único usuário (quase todos os computadores
pessoais) não há procedimento de login pois o acesso físico ao hardware
confirma seu direito de utilizar o sistema.
Antes que seja possível uma operação de login, o administrador do
sistema deverá criar uma conta para o usuário. Sem esse cadastramento o UNIX
não permitirá o acesso aos seus recursos.
Uma vez ligado o terminal, pressione <enter> ou <ctrl-d> para receber
o sinal de login, cuja mensagem pode variar ligeiramente dependendo da versão
do UNIX. Digite agora a sua conta ou nome de usuário (verifique com o guru
local) e sua senha, que não será ecoada na tela por questões de segurança.
Assim, o UNIX verifica seu direito de acesso e a partir disso, é mostrado o
"prompt" ($) e você está habilitado a utilizar o sistema.
Com o passar do tempo, o processo de login vai se tornando uma tarefa
extremamente rotineira mas sempre preste atenção nas mensagens
apresentadas. Você poderá ter correspondências, alguns avisos importantes do
administrador e outros.
Para encerrar sua sessão de uso, digite <ctrl-d> ou exit ou logout. É um
procedimento importante para que o acesso a sua conta não fique aberto.
passwd (PASSWORD)
Função: Mudar a senha de acesso ao sistema.
Formato: passwd
Descrição
O comando passwd é utilizado para modificar a password dos usuários.
Com esse comando, você pode modificar apenas a sua senha. Digitando o
comando passwd será solicitada sua senha atual e posteriormente sua nova
senha, que deverá ser informada duas vezes para confirmação.
O administrador do sistema tem privilégios para alterar a senha de
qualquer usuário.
Exemplo: Mude sua própria senha de acesso ao sistema:
passwd
ls (LIST)
Função: Listar o conteúdo dos diretórios
Formato: ls [-1Almt] [Arquivo...] [Diretório...]
Descrição
O comando ls é utilizado para listar os arquivos em diretórios e para
listar informações sobre arquivos. As opções podem ser utilizadas para controlar
as informações impressas de cada arquivo e para controlar a ordem da lista.
Opções:
-1 - mostra os nomes de arquivo em uma s¾ coluna
-A - mostra tambÚm os arquivos que comeþam por . (escondidos)
-l - apresenta vßrias informaþ§es sobre o arquivo (longo)
-t - classifica de acordo com a data de modificaþÒo
Arquivo - lista de arquivos que se deseja verificar. Separador = espaþo
Diret¾rio - lista de diret¾rios que se deseja verificar.
Exemplos:
Liste os arquivos no diret¾rio atual:
ls
Liste em 1 coluna todos os arquivos do diret¾rio 'ufpa':
ls -1 /ufpa
Liste em formato longo os arquivos do diret¾rio corrente:
ls -l
Liste os arquivos no diret¾rio '/bin' de acordo com a data de
modificaþÒo e formato longo:
ls -lt ou ls -l -t
date
Função: Apresentar e alterar a data do sistema
Formato: date
Descrição
O comando date é utilizado para alterar e/ou exibir a data e hora do
sistema mas somente o administrador do sistema pode alterar essas
informações.
Exemplo: date
cat (CONCATENATES OR DISPLAY FILES)
Função: Concatenar ou mostrar o conteúdo de arquivos e digitar arquivos
simples.
Formato: cat [arquivo]
Descrição
O comando cat é usado para dois propósitos: apresentar o conteúdo de
arquivos no terminal e para concatenar vários arquivos em um, usando o
redirecionamento de saída. Quando utilizamos cat para concatenar arquivos, não
é interessante que o arquivo de saída seja o mesmo que o(s) arquivo(s) de
entrada, o resultado poderá ser diferente do esperado.
Exemplos:
Crie o arquivo teste1, digitando algo para o mesmo:
cat > teste1
Apresente na tela os arquivos teste1 e teste2:
cat teste1 teste2
Junte os arquivos teste1 e teste2 para teste3:
cat teste1 teste2 > teste3
Junte todos os arquivos teste? em teste4:
cat teste? > teste4
Junte teste3 e teste1 em teste5 (nesta ordem):
cat teste3 teste1 > teste5
Junte os arquivos teste1 e teste3 em teste5:
cat teste[31] > teste5
wc (WORD COUNT)
Função: Contar o número de linhas, palavras e caracteres contidos num arquivo.
Formato: wc [-lwc] [Arquivo...]
Descrição
O comando wc é usado para contar unidades de texto em arquivos de
textos.
Opções:
-l - mostra o n·mero de linhas contidas no arquivo
-w - mostra o n·mero de palavras contidas no arquivo
-c - mostra o n·mero de caracteres no arquivo
Arquivo - lista de arquivos que se deseja verificar. Separador =
espaþo
Exemplos:
Conte as linhas, palavras e caracteres em 'teste2':
wc teste2 ou wc -lwc teste2
Conte o n·mero de linhas de 'teste2':
wc -l teste2
Conte o n·mero de linhas e caracteres:
wc -lc teste2
who
Função: Mostrar os usuários que estão utilizando o sistema.
Formato: who [?] [-us] [am i]
Descrição
O comando who produz uma lista com todas as pessoas que estão
acessando o sistema no momento. A lista contém nome, terminal, data e hora do
acesso de cada usuário.
Opções:
? - mostra apenas o nome do usußrio corrente
-u - mostra informaþ§es ·teis sobre os usußrios correntemente
logados
-s - apresenta informaþ§es resumidas
am i - mostra as informaþ§es do usußrio corrente
Exemplos:
Liste os usußrios atuais:
who
Liste seu nome de acesso ao sistema:
who am i
Outros
who ?
who -u
man (MANUAL)
Função: Apresentar a descrição, sintaxe e exemplos de dado comando.
Formato: man [comando]
Descrição
O comando man é utilizado para localizar e imprimir citações do manual
do UNIX. Ele é basicamente usado pelos usuários para reproduzir seções do
manual, como uma rápida referência quando o mesmo não está disponível. Para
navegar no texto use <barra de espaço> e <ctrl-b>. Para encerrar a consulta,
<ctrl-c>. Alguns comandos não possuem manual de informações disponível.
Exemplos:
man ps
man date
mail
Função: Enviar e receber correspondência para/de usuários.
Formato:
mail [-rp] [-f arquivo]
mail [usußrio]
Descrição
O envio e recepção de correspondência é uma característica bastante
interessante e usada do UNIX. o comando mail permite troca de
correspondências entre usuários ou grupos de usuários que pertençam a nossa
instalação. Quando iniciamos uma sessão, se alguém nos tiver enviado alguma
correspondência, o sistema apresentará a mensagem "You have mail". Digite
mail e você poderá executar uma das ações abaixo com a sua correspondência.
d - eliminar correspondências
s - anexar correspondências a um arquivo
t - dirigir-se para o topo da lista de correspondências
? - mostrar as opções do mail
q - sair do mail
Para enviar uma mensagem digite mail seguido dos nomes dos usuários
que você deseja que recebam sua correspondência. Depois disso informe o
assunto, o texto e encerre a digitação com <ctrl-d>. Em seguida digite <enter>
e a correspondência já terá sido enviada.
O mail não possui muitas facilidades para edição do texto a ser enviado.
A partir do momento que você encerrou a digitação de uma linha com <enter>,
não será mais permitido o acesso a ela. Portanto se você deseja enviar um texto
mais polido e trabalhado crie um arquivo com o mesmo via um editor de textos.
Opções:
-r - mostra as mensagens mais antigas primeiro
-p - mostra todas as mensagens sem pausa
Exemplos:
Recebe a correspondÛncia:
mail
Envia correspondÛncia para os usußrios 'joÒo' e 'jose':
mail joao jose
Envia correspondÛncia ao 'reitor' que estß contida no arquivo
'oficiodoc':
mail reitor < oficiodoc
4. Manipulação de arquivos
Um arquivo UNIX não possui formato predefinido. Não possui
comprimento de linha ou marcador de fim de arquivo. Ele é considerado pelo
sistema como sendo apenas um "string"de caracteres. Os componentes de um
arquivo são: seu nome, conteúdo e outros dados identificadores. Em UNIX
existem três tipos de arquivos:
Arquivos ordinários
Um arquivo ordinário, ou comum, é utilizado para armazenar
informações. Um arquivo ordinário pode conter um programa a ser executado, o
texto de um documento, os registros de uma companhia, ou qualquer outro tipo
de informação que um computador possa processar.
Diretórios
São arquivos que contêm listas de arquivos. Programas em execução
podem ler os arquivos de diretório, mas para garantir a integridade das
informações, somente o sistema operacional pode atualizá-los. Os diretórios
contém o nome e o inode, que é um ponteiro para onde se encontram outras
informações do arquivo.
Arquivos especiais
Uma das características do UNIX é a associação de todo o hardware de
E/S com arquivos especiais. O acesso ao próprio hardware de E/S imita o acesso
aos arquivos em disco comuns. Cada dispositivo de E/S (impressora, teminal,
disco, unidade fita, etc.) possui pelo menos um arquivo especial. Um programa
pode acessar um arquivo especial para acessar o hardware de E/S. Embora
pareça complicado é na verdade uma grande simplificação comparada à maioria
dos outros sistemas de computador.
Os tipos de arquivo vistos acima são agrupados em diretórios e os
diretórios são organizados em hierarquia. O topo da hierarquia é um diretório
especial chamado de raiz. O diretório raiz contém uma variedade de arquivos
relacionados ao sistema e inclui alguns diretórios como /bin, /usr, /dev, /etc e /lib.
Nomes
Veremos agora algumas regras e convenções para a construção de
nomes de arquivos do UNIX.
- Procure usar nomes descritivos;
- Tamanho máximo de 255 caracteres alfanuméricos (recomendado =
10);
- Espaços em branco não permitidos;
- Não podem começar por + nem -;
- Nomes de comandos do sistema são palavras reservadas;
- Sensível à caixa, teste =/= TESTE =/= Teste;
- Arquivos começando com ponto ficam escondidos do formato default
dos comandos ls e li;
- Não use os metacaracteres do shell - * ? < > / ; &. Apesar de aceitos
são problemáticos no acesso aos arquivos.
- O caracter ponto (.) não estando na primeira posição, não possui
siginificado especial, podendo ser utilizado repetidas vezes no mesmo
nome de arquivo;
- Algumas convenções:
arquivo.c Código fonte em C
arquivo.h Arquivo para "include" do C
arquivo.f Código fonte em FORTRAN
arquivo.p Código fonte em PASCAL
arquivo.s Código fonte em ASSEMBLY
arquivo.o Código objeto
Caminhos ou vias
Um nome de via especifica um caminho através do sistema de arquivos,
que nos leva ao arquivo desejado. Caminhos podem ser de dois tipos:
- Full ou completo - começa com /, ou seja, define o caminho a partir
da raiz
- Relativo - começa a partir de determinado diretório, que deverá ser
referenciado por um ponto (.), significando o diretório
corrente e ponto ponto (..), significando o diretório pai do
atual.
Veja abaixo algumas regras para utilização de diretórios:
1. Se o nome de via começa com uma barra, então a via começa no
diretório raiz. Todas as outras começam no diretório atual.
2. Um caminho ou via é uma lista de nomes separados por barras ou um
único nome. Os nomes iniciais na lista (se houver) são diretórios. O
nome final na lista é o arquivo alvo, o qual pode ser um arquivo de
qualquer tipo.
3. Podemos ascender hierarquicamente ao sistema de arquivos
especificando o nome ".." em um nome de via. Todos os outros nomes
em um caminho descem na hierarquia.
4. Nenhum espaço é permitido em um nome de via.
Comandos para manipulação de diretórios
pwd (PRINT WORKING DIRECTORY)
Função: Mostrar o diretório corrente.
Formato: pwd
Descrição
Imprime o nome de caminho completo (desde de a raiz) do diretório
atual. É boa política sempre usar este comando, principalmente quando você for
apagar arquivos, a fim de ter certeza do que está fazendo.
Exemplo: pwd
mkdir (MAKE DIRECTORY)
Função: Criar um diretório.
Formato: mkdir diretório
Descrição
Utilizamos mkdir para criar diretórios. Para tanto, devemos ter permissão
de gravação no diretório de origem do diretório que será criado.
Exemplos: Crie o diretório '/u/mario/progs':
mkdir /u/mario/progs
Crie, a partir do diretório corrente, o diretório 'progs':
mkdir progs
cd (CHANGE DIRECTORY)
Função: Possibilita o caminhamento na árvore de diretórios do sistema.
Formato: cd [Diretório]
Descrição
Com cd, você pode mover-se de um diretório para o outro usando
caminhos completos (full) ou relativos. cd sozinho volta sempre para o diretório
"home", que é o diretório em que você é colocado logo após o login.
Exemplos: Caminhe para o diretório '/u/mario/progs':
cd /u/mario/progs
Mude para o diretório pai do diretório atual:
cd ..
Mude para o diretório "home":
cd
rmdir (REMOVE DIRECTORY)
Função: Remove um diretório
Formato: rmdir [Diretório]
Descrição
Usado para remover diretórios vazios. Por definiçao, um diretório vazio é
aquele que contém somente duas entradas '.' e '..'. Para removermos um
diretório precisamos ter permissão de gravação no diretório de origem (pai).
Exemplos: Remova o diretório 'progs' que está abaixo do atual:
rmdir progs
Remova o diretório '/u/mario/progs':
rmdir /u/mario/progs
Proteção
chmod [CHANGE MODE]
Função: Muda o modo de acesso a um arquivo
Formato: chmod modo arquivo
Descrição
A capacidade de regular o sistema de arquivos para um acesso flexível e
protegido aos arquivos é uma das vantagens do sistema UNIX. O comando
chmod, que será apresentado mais adiante, permite a mudança de modo dos
arquivos mas apenas pelos proprietário do arquivo ou pelo superusuário
(administrador do sistema).
As três operações que podem ser desempenhadas num arquivo são
leitura, gravação e execução. Existem três níveis de privilégio associados com
cada arquivo, os privilégios de propriedade, os privilégios de grupo e os
privilégios dos outros. Para cada nível de privilégio, cada uma das operações
básicas pode ser permitida ou negada.
Podemos determinar os modos dos arquivos que possuímos usando a
seguinte convenção para utilizar o chmod:
Quem Operadores
u usuário (proprietário) - remove a premissão
g grupo + acrescenta a permissão
o outros = designa permissão
a todos (ugo)
Permissões
r leitura
w gravação
x execução
Exemplos: Retire do arquivo teste, as permissões de gravação e leitura para os
do grupo e outros:
chmod go-rw teste
Atribua a todos o direito de leitura e gravação sobre o arquivo
teste1:
chmod a=rw teste1
Torne impossível para qualquer um criar arquivos no diretório atual:
chmod a-w
Torne o arquivo '[Link]' executável:
chmod + x [Link]
Faça as permissões de grupo e outros para o arquivo 'teste5' o
mesmo que permissões atuais do proprietário:
chmod go = u teste5
Movimento e mudança de nome
mv (MOVE)
Função: Mover e renomear arquivos.
Formato: mv [Arquivo1] [Arquivo2]
mv [Arquivo1...] [Diretório]
Descrição
O comando mv é utilizado para gerenciar arquivos. Em sua forma mais simples é
usado para renomear arquivos, mas pode ser utilizado para mover arquivos de
um diretório para outro.
Opções: Arquivo1 - nome atual do arquivo
Arquivo2 - nome novo do arquivo
Diretório - diretório que receberá os arquivos
Se Arquivo1 é uma lista de arquivos, então o segundo argumento deverá
ser obrigatoriamente um diretório.
Se o Arquivo2 for o nome de um arquivo já existente, o Arquivo1 será
gravado sobre o Arquivo2. Tenha cuidado!!.
Sempre ao final da execução deste comando a quantidade de arquivos
permanece a mesma. Os arquivos movidos ou renomeados herdarão os mesmos
atributos dos arquivos fonte.
Exemplos: Renomeie o arquivo 'teste1' para 'teste2':
mv teste1 teste2
Transporte o arquivo 'teste1' para o diretório '/u/joao':
mv teste1 /u/joao
Transporte todos os arquivos no diretório '/u/ricardo' para o
subdiretório /u/aurelio':
mv /u/ricardo/* /u/aurelio
cp (COPY)
Função: Copiar arquivos.
Formato: cp [Arquivo1] [Arquivo2]
cp [Arquivo1...] [Diretório]
Descrição
Possibilita a cópia de arquivos dentro de um mesmo diretório, cópias
entre diretórios e até cópia completa de diretórios.
Opções: Arquivo1 - nome do arquivo fonte
Arquivo2 - nome do arquivo destino
Diretório - nome do diretório alvo
Exemplos: Faça uma cópia do arquivo '[Link]' para o arquivo 'nk.2':
cp [Link] nk.2
Copie todos os arquivos do subdiretório 'textos' para o subdiretório
'newtext':
cp textos/* newtext
Copie todos os arquivos com o sufixo '.doc' no diretório atual para o
subdiretório 'newtext':
cp *.doc newtext
rm (REMOVE)
Função: Remover arquivos.
Formato: rm [-fir] arquivo...
Descrição
O comando rm nos permite deletar arquivos ordinários. Para
removermos um arquivo, devemos ter permissão de gravação no diretório que
contém o arquivo desejado, mas não precisamos desta permissão ou da
permissão de leitura para o arquivo em si. Se não tivermos essa permissão, rm
imprimirá o modo do arquivo e aguardará até que possamos inserir "y" ou "n"
para indicar se realmente desejamos remover o arquivo.
Opções: -f - a opção de força remove os arquivos sem se preocupar se temos
ou não a permissão de gravação no arquivo. Nenhuma consulta ao
usuário é feita;
-i - a opção interativa faz com que rm solicite confirmação para a
remoção;
-r - a opção recursiva é utilizada para remover uma sub-árvore
inteira do sistema de arquivos. No argumento arquivo você coloca
o nome do diretório que terá todos os seus arquivos e
subdiretórios apagados. Use essa opção com cuidado e junto com
-i para obter maior segurança.
Exemplos: Remova o arquivo 'ufpa':
rm ufpa
Remova vários arquivos:
rm texto1 texto5 texto12
Remova todos os arquivos do diretório 'trab':
rm trab/*
Remova todos os arquivos do diretório 'trab', interativamente:
rm -i trab/*
Remova a sub-árvore liderada pelo diretório '/trab/teste':
rm -r /trab/teste
Remova todos os arquivos do diretório 'trab' sem perguntar pelos
arquivos protegidos:
rm -f trab/*
Tabela resumo das permissões requeridas por comando
Comando Diretório Arquivo Diretório Destino
Fonte fonte
cd x N/A N/A
ls, li r N/A N/A
mkdir x, w (pai) N/A N/A
rmdir x, w (pai) N/A N/A
cat,pg,more x r N/A
mv x, w Nenhum x, w
cp x r x, w
touch x N/A Nenhum
rm x, w Nenhum N/A
5. Processos
Características
Para o sistema operacional UNIX, um processo é um programa em
execução. É uma tarefa submetida ao sistema para ser executada. Uma outra
maneira de se definir um processo em UNIX é dizer que o mesmo é a execução
de um programa dentro de um ambiente próprio. O UNIX suporta a ilusão de
que os processos têm vida e, desse modo, poderemos manipulá-los como tal. As
entidades arquivo e processo são os dois conceitos centrais do modelo do
sistema UNIX.
Como pode ser visto na figura abaixo, programas como o shell ou
editores interagem com o kernel invocando chamadas do sistema (system calls).
Essas chamadas instruem o kernel a executar várias operações para os
programas que as chamaram. O intercâmbio de dados entre o kernel e os
programas é um exemplo.
Fig. 4 - A estrutura do sistema UNIX
As principais características de um processo são:
- Multi-tarefa - Muitos processos podem executar "simultaneamente".
O termo mais apropriado seria concorrentemente.
Muitas ocorrências do mesmo programa podem ser
executadas ao mesmo tempo.
- Auto-contido - Cada processo é executado independentemente no
seu próprio ambiente, mas podem comunicar-se com
outros processos e com o resto do mundo via
chamadas do sistema.
Os processos normalmente executam em modo usuário, entretanto,
quando chamadas ao sistema são usadas, o processo é chaveado para modo
supervisor (kernel).
O ambiente de um processo é um conjunto de informações que
possibilitam ao UNIX o controle e a gerência sobre os processos em execução. O
ambiente de um processo é constituído pelas seguintes informações:
- Programa;
- Dados;
- Arquivos abertos;
- Diretório corrente;
- Identificação do usuário;
- Identificação do processo;
- Identificação do processo pai;
- Outras variáveis do sistema.
O UNIX possui a facilidade de execução de processos em vanguarda
(foreground) ou em retaguarda (background). Às vezes precisamos executar
programas que levam muito tempo para terminar. Se o mesmo não exige
entrada do terminal, então você pode rodá-lo sem a atenção do operador. Um
usuário pode disparar vários processos em background enquanto executa outra
tarefa em foreground já que o UNIX irá rodá-las concorrentemente. Para rodar
um processo em background, coloque um símbolo de & no final do comando que
irá disparar o processo. Por exemplo:
find / -print > arqs &
sort bigfile > out &
[Link] > saida &
Processos do sistema
Nesse ponto é importante ressaltar que o UNIX tem seus próprios
processos, que possuem funções específicas para gerenciamento, controle,
acompanhamento e contabilidade do sistema. Dentre eles podemos citar:
Daemons
Um daemon (demônio) é um processo que nunca encerra. Tipicamente é
um job usado para invocar outros processos em resposta a algum evento. Como
exemplos podemos citar tarefas que são realizadas por daemons do sistema:
- contabilidade de uso do sistema;
- monitoração das filas de impressão;
- gerência de acesso a rede;
- submissão de processos pendentes.
Inicialização
Quando da inicialização do sistema, o primeiro processo a ser disparado
é o init. O init, por sua vez, desova (spawns) um processo chamado getty para
cada terminal ativo no momento.
Quando um usuário inicia um login, digitando sua identificação o
processo getty é substituído por um processo login. Se a identificação do usuário
é aceita, o processo login é substituído por um processo sh (shell). Desse modo,
após todos esses passos é que o UNIX está com o shell disponível para receber
comandos do usuário.
No processo de log off, quando o usuário digita <ctrl-d> o processo sh é
encerrado e o init desova um novo processo getty para o terminal em questão.
Controle e monitoração
Apresentaremos agora os comando básicos para permitir ao usuário o
acompanhamento e controle da execução de seus processos.
ps (PROCESS STATUS)
Função: Imprimir a informação sobre o estado dos processos.
Formato: ps [-efklpu]
Descrição
O comando ps é utilizado para imprimir informações sobre os processos
ativos. Ps faz para os processos o que ls faz para os arquivos. Dependendo das
opções utilizadas, ps poderá apresentar as seguintes informações:
UID - identificação do usuário dono do processo
PID - número de identificação do processo
PPID - identificação do processo pai
PRI - prioridade do processo; números maiores representam
prioridades menores
NI - valor do nice que é usado no cálculo da prioridade
TTY - terminal de controle do processo
CMD - o nome do comando
Opções: -e - mostra todos os processos com excessão dos processos do
kernel
-f - gera uma listagem completa
-k - imprime informações sobre os processos do kernel
-l - gera uma listagem longa
-p - mostra apenas as informações sobre os números de processos
especificados
-u - mostra apenas informações sobre os processos do usuário
especificado
Exemplos: Liste os processos que você iniciou:
ps
Mostre todas as informações disponíveis sobre todos os processos:
ps -e -f -l
Liste os processos do joao e do ricardo:
ps -f -l -u joao,ricardo
Produza alguma informação sobre os processo 9727:
ps -p 9727
nohup (NO HANG UP)
Função: Dispara a execução de um comando que é imune a desligamentos.
Formato: nohup comando
Descrição
Normalmente, a qualquer comando que iniciamos em background será
enviado um sinal de desligamento quando abandonamos o sistema. A maioria
dos programas encerra quando recebe este sinal. O comando nohup é utilizado
para disparar processos que ignorem esses sinais. Desse modo, qualquer
processo que seja executado com nohup não "morrerá" quando abandonarmos o
sistema. Nohup dirige a saída padrão para o arquivo '[Link]' e comandos
executados com nohup não deverão depender de interação com o terminal.
Exemplos: Dispare a execução do "script" '[Link]' em background imune
a desligamentos:
nohup [Link] &
kill
Função: termina ou "mata" um processo.
Formato: kill [-9] processos
Descrição
O comando kill é utilizado para terminar processos em background, já
que os foreground são encerrados com um <ctrl-d> ou <ctrl-c>. Para terminar
um processo, precisamos saber seu número de identificação e sermos
proprietários do mesmo ou superusuário.
Opções: -9 - usado para encerrar efetivamente um processo, já que alguns
processos ignoram o sinal enviado pelo kill sem essa opção
Exemplos: Encerre os processos 3424 e 3567
kill 3424 3567
Encerre efetivamente o processo 3745
kill -9 3745
6. Shell
Características
Para facilitar o controle do computador foram desenvolvidas linguagens
de comando. A maioria das linguagens de comando foi desenvolvida para que
haja comandos fáceis para especificar ações comuns. A maioria dos
computadores fornece um interpretador de comandos para desempenhar essa
função. O interpretador de comandos do UNIX é chamado de shell. O shell
fornece uma abundância de características que tornam possível especificar
comandos muito poderosos. É possível usar o UNIX com apenas poucos
conhecimentos sobre o shell. Entretanto, a sua utilização será tanto mais
profissional e compensadora quanto você estudar e conhecer melhor o shell.
O shell habilita o usuário a interagir com os recursos do computador,
como programas, arquivos e dispositivos.
Como interpretador de comandos, o shell gerencia a interação entre o
usuário e o UNIX, recebendo as entradas do usuário, interpretando essa entrada
e manipulando as saídas geradas pelo sistema operacional. O shell também pode
ser usado como uma linguagem de programação, já que os usuários podem
combinar sequências de comandos para criar novos programas chamados shell
scripts.
A figura abaixo mostra que para cada processo submetido ao sistema, o
shell abre automaticamente 3 arquivos. Esses arquivos serão a partir de agora
referenciados como:
Entrada padrão - é o teclado por default.
Saída padrão - é o vídeo por default.
Saída padrão para erros - é o vídeo por default.
Esses defaults podem ser modificados usando redireção que será
mostrada mais adiante.
Fig. 5 - Os arquivos padrão
Redireção
O conceito de redireção é usado para alterar os defaults de entrada,
saída e saída de erros padrão apresentados anteriormente. Desse modo,
podemos ter três tipos de redireção:
Redireção da entrada padrão, que é usada para indicar entrada de
dados de algum lugar que não o teclado e é representada pelo símbolo <.
Exemplos:
mail joao < [Link]
wall < [Link]
Redireção da saída padrão, que é usada para enviar os dados de saída
para algum lugar que não o vídeo. É representada pelos símbolos > e >>.
Exemplos:
ls > [Link]
cat texto2 >> texto1
No primeiro exemplo, a saída do comando ls será enviado para o arquivo
'saí[Link]'. Se 'saí[Link]' já existir seus dados serão perdidos. No segundo exemplo,
o 'texto2' será anexado ao 'texto1'. Caso 'texto1' não exista, será criado.
Redireção da saída de erros padrão, usada para enviar os erros que
porventura ocorram durante a execução de um comando para algum lugar que
não o vídeo. Os símbolos utilizados para representá-la são 2> e 2>>. Exemplos:
cat arq1 arq2 2> arqerro
cat arq1 arq2 2> /dev/null
psx 2>> erros
No segundo exemplo, os erros que porventura ocorram serão
desprezados, já que '/dev/null' é um "bit bucket" para onde é enviado tudo o que
se pode perder.
Em UNIX, quando uma linha de comando for muito extensa, use o
caracter "\" para quebrar a linha numa linha de continuação. Exemplo:
cat /usr/uts/meudir/meusdados \
> /usr/uts/ seudir/seusdados
O sinal ">" foi impresso pelo shell e a barra invertida (\) deve ser
seguida imediatamente por um <return>.
Para agrupar comandos, você pode utilizar o ";". O efeito será o mesmo
que se você tivesse digitado os comandos separadamente. Não há nenhum
relacionamento entre os comandos. Exemplo:
cat arq1 ou cat arq1; ls -l
ls -l
Canalização e filtros
Uma canalização é uma conexão da saída padrão de um comando com a
entrada padrão de outro comando. O símbolo que representa a canalização é o
"|" e pode ser usada várias vezes numa linha de comando. Exemplos:
Quantos arquivos têm o seu diretório?
ls | wc -w
Quais os processos que são controlados pelo terminal hft/0?
ps -e | grep hft/0
Quantos usuários estão correntemente logados?
who | wc -l
Filtros são programas que podem ler dados de uma entrada e gravá-los
numa saída. A importância deles é que poderão ser usados como intermediários
em canalizações. Exemplos de filtros do UNIX são: sort, wc, cat, cut, grep, tee
além de outros. Exemplos:
Quantos processos são controlados pelo terminal pts/1?
ps -e | grep pts/1 | wc -l
ls | tee intermed | sort -r
O filtro tee tem a função de bifurcar uma entrada recebida, gravando-a
em 'intermed' e também passando-a ao comando sort.
Metacaracteres e coringas
A maioria dos argumentos da linha de comando que são fornecidos aos
programas são nomes de arquivos. É muito comum nomear arquivos de forma
que arquivos relacionados tenham nomes relacionados. Por exemplo, todos os
nomes de programas da linguagem C terminam com o sufixo ".c". Se
quiséssemos executar alguma operação em todos os arquivos em linguagem C
de um diretório, seria bastante monótono digitar todos os nomes como
argumentos em uma linha de comando.
O UNIX permite que especifiquemos conjuntos de nomes de arquivos
automaticamente. Quando inserimos os argumentos a um comando, o shell
examina os argumentos para verificar se estamos utilizando a simbologia de
geração de nomes de arquivo. Podemos controlar a geração de nomes de
arquivos especificando um modelo para estes. O shell compara o seu modelo
com todos os nomes de arquivos no atual diretório. Se qualquer um dos nomes
de arquivos combinar com o modelo, então a lista em ordem alfabética dos
nomes dos arquivos combinados é entregua ao programa. Se nenhum dos
nomes de arquivo combinar com o modelo, nada será entregue ao programa.
Um modelo consiste em caracteres ordinários e metacaracteres. Os
caracteres ordinários representam eles mesmos, enquanto os metacaracteres
têm significados especiais. Um modelo que consiste inteiramente de caracteres
ordinários não invoca a geração de nomes de arquivos.
Um aspecto importante nesse ponto é conhecer os metacaracteres do
shell e não utilizá-los em nomes de arquivos.
A maioria dos documentos do UNIX usa a frase "regular expression"
para se referir ao que aqui consideramos um modelo. O termo modelo é melhor
pois sugere boa percepção intuitiva ao já confuso tópico de geração de nomes e
metacaracteres.
Coringas ou wildcards são um subconjunto dos metacaracteres. Eles são
usados para o "casamento" de nomes de arquivos. Acompanhe a tabela abaixo
que mostra a função de cada metacaracter e/ou coringa:
Símbol É Função
o coringa?
* sim Compara qualquer série de caracteres
? sim Compara qualquer caractere simples
[ sim Introduz um grupo de caracteres
] sim Termina um grupo de caracteres
- não Indica o limite dos caracteres
! sim Negação
> não Redireção de saída
< não Redireção de entrada
& não Processamento em background
$ não Macros
Para facilitar a apresentação, metacaracteres e coringas serão
apresentados através de exemplos.
Listar todos os arquivos que começam com a letra c:
ls c*
Apagar os arquivos que começam com a letra c seguida de mais um
caracter qualquer:
rm c?
Tenha muito cuidado com o comando abaixo:
rm *
Copiar todos os arquivos que começam com uf para o diretório
/u/ricardo:
cp uf* /u/ricardo
Remover os arquivos co1, co2 e co3 deixando co4 e co5 intactos:
rm co[123]
Apagar os arquivos lot, cor, tom, boa:
rm [lctb]o[trma]
Listar os arquivos que começam com letras entre a e g:
ls [a-g]
Listar todos os arquivos que não terminam com b ou c:
ls *[!bc]
7. O editor "vi"
Características
O "vi" faz parte de uma família de editores de texto do AIX. Cada um
deles tem suas próprias características e usos. Suas principais características
são:
- é um editor de tela cheia, sendo um dos mais usados da família;
- cria e modifica textos apenas, não possuindo capacidade de
formatação de textos;
- trabalha em cima de uma cópia do arquivo num buffer de memória;
- possui capacidade para pesquisa e substituição de textos;
- trabalha com dois modos de operação: modo de comando e modo de
edição de texto;
- possibilidade de edição de mais de um texto por vez.
Movimento do cursor
No "vi", os movimentos do cursor obedecem as seguintes teclas:
<seta p/ esquerda> ou h - um caractere a esquerda
<seta p/ direita> ou l - um caractere a direita
<seta p/ baixo> ou j - uma linha p/ baixo
<seta p/ cima> ou k - uma linha p/ cima
<ctrl+f> - uma tela para frente
<ctrl+b> - uma tela para trás
<ctrl+d> - meia tela para baixo
<ctrl+u> - meia tela para cima
As teclas acima só funcionam se você estiver no modo de comando do
"vi". Caso você não esteja no modo de comando, tecle <esc> para tal. Outros
comandos que podem ser úteis para o movimento do cursor são:
:nn - leva o cursor diretamente para a linha nn
:$ - leva o cursor diretamente para o fim do arquivo
0 - leva o cursor para o início da linha
$ - leva o cursor para o final da linha
nn<espaço> - move o cursor para a n-ésima posição na linha corrente
nnw - move o cursor para a n-ésima palavra na linha corrente
Criação, saída e gravação
Para criar um arquivo chamado 'teste', digite:
vi teste
Tecle 'a' para iniciar a digitação. O comando 'a' (Add text) coloca o
editor no modo texto e não aparecerá na tela quando digitado.
Depois de digitado o texto, você tem várias opções a seguir:
Digite <esc> e
:w - grava o texto e continua a edição
:q - sai do "vi"
:wq - grava e sai
:q! - força a saída mesmo sem ter gravado o texto
Inserção e deleção
Para um aprendizado inicial do editor "vi", os seguintes comandos são
importantes:
i - permite a inserção de texto antes do cursor e chaveia para o modo
texto
dd - deleta uma linha inteira
x - deleta um caracter na posição corrente do cursor
dw - deleta a palavra onde se encontra o cursor
o - abre uma linha em branco depois da linha atual do cursor
O - abre uma linha em branco antes da linha atual do cursor
Pesquisa e troca de "strings"
Para pesquisar uma cadeia de caracteres, passe para o modo comando
<esc> e use os seguintes comandos:
/texto - pesquisa a palavra 'texto' a partir da posição atual do cursor
para o final doo arquivo.
?texto - procura a palavra 'texto' a partir da posição atual do cursor para
o início do arquivo
n - continua a busca da próxima ocorrência da cadeia solicitada no
mesmo sentido de pesquisa
N - continua a busca da próxima ocorrência da cadeia solicitada no
sentido contrário da pesquisa inicial
Para realizar busca e troca, observe o seguinte exemplo:
:g/mario/s//ricardo/g
Esse comando busca a cadeia 'mario' em todas as linhas e troca-a por
'ricardo' em todas as ocorrências (de 'mario') no texto. Para entender melhor
faça outros exemplos.
Cópia e transferência de linhas
Existem muitas maneiras para realizar cópia e transferência de linhas no
"vi". Para o usuário iniciante existe uma maneira simples e rápida de efetuar
essas operações. Siga o seguinte roteiro:
Posicione o cursor na primeira linha que você deseja transferir. Digite
ndd onde n é o número de linhas (inclusive a atual) que você deseja transferir.
Feito isso, navegue com o cursor para o ponto onde você deseja receber as
linhas e digite p. Dessa forma você terá feito a transferência. No caso de cópia,
após apagar as linhas (com ndd), reinsira-as com p antes de navegar para o local
que irá receber as linhas.
Desfazendo erros
Para desfazer erros proventura cometidos, o "vi" dispõe dos seguintes
comandos:
:u - desfaz um comando
:. - refaz um comando refeito
Customização de ambiente
O "vi" dispõe de inúmeras características que podem ser adaptadas pelo
usuário ao seu gosto ou necessidade. Apresentaremos apenas as seguintes:
set number / nonumber - liga / desliga a numeração das linhas
set showmode / noshowmode - liga / desliga o status de modo de
operação
set all - mostra o status de tudo o que foi "setado"
8. Utilitários e ferramentas
O UNIX possui muitos utilitários para as mais variadas aplicações como:
manipulação de textos, pesquisa de arquivos, backup, compactação de dados,
etc... Neste capítulo apresentamos apenas uns poucos comandos que devem ser
conhecidos por todo usuário UNIX noviço.
find
Função: Busca de arquivos
Formato: find diretório... condição...
Descrição
O comando find é um auxílio para localizarmos arquivos perdidos. Find
examina a árvore do sistema de arquivos procurando por arquivos que atendam
a condição estabelecida pelo usuário.
Opções: diretório - diretório a partir do qual será feita a pesquisa
-exec cmd
Especifica um comando a ser executado. O fim do comando é
indicado com um ponto e vírgula escapado. Dentro do comando o
argumento "{}" é substituído pelo nome de via atual
-name arquivo
Especifica um nome de arquivo utilizando os metacarcteres do
shell de costume. Os metacaracteres devem ser escapados para
que sejam passados para o comando find.
-newer arquivo
Determina que os arquivos examinados deverão ser mais novos
que o arquivo nomeado
-ok cmd
O mesmo que exec, exceto que cmd é apresentado na tela com
uma interrogação e, é dada chance ao usuário de responder com
'y' ou 'n'.
-print
Gera o nome da via onde encontrou o arquivo que satisfaz a
condição.
-size n
Especifica o tamanho do arquivo em blocos.
-user usuário
Define o proprietário do arquivo.
-mtime +n / -n
Especifica se o arquivo foi modificado a mais de n dias atrás (+),
ou menos (-) de n dias atrás.
-type f/d
Especifica se o arquivo deve ser ordinário (f) ou diretório (d).
Exemplos: Imprima uma lista de todos os arquivos na sub-árvore atual:
find . -print
O efeito da opção -print pode ser simulado através do comando
echo:
find . -exec echo {}\;
Ache todos os arquivos de carlos que estão perdidos na subárvore
/usr/george:
find /usr/george -user carlos -print
Encontre todos os arquivos no sistema de arquivos que possuam
mais de 100 blocos de comprimento e gere uma listagem de
formato longo para cada um:
find / -size +100 -exec ls -1 {}\;
Encontre todos os arquivos modificados a mais de 10 dias:
find / -mime +10 -print
Procure pelos arquivos ordinários que tem mais de 2 blocos:
find . -name 's*' -type f -size +2 -exec ls -l {} \;
grep
Função: Busca de texto em arquivos
Formato: grep [-clvn] expressão [Arquivo...]
Descrição
Realiza a busca de modelos no arquivo nomeado ou na entrada padrão,
se nenhum arquivo for mencionado. Os modelos de texto são indicados pelo
argumento da expressão. Sem opções, o grep imprime cada linha de entrada
que contenha o modelo de texto especificado na expressão.
Opções: -c - produz uma contagem de linhas ao invés das próprias linhas
-l - lista os nomes dos arquivos que contêm os modelos pedidos
-v - imprime as linhas que não contêm os textos especificados
-n - imprime o número relativo das linhas de saída
-y - ignora caixa
-e - expressão a ser "casada"
Exemplos: Determine que usuário está acessando a console:
who | grep hft
Imprima todas as linhas que não contenham um hífen no arquivo
'xyz':
grep -v -e - xyz
Imprima e numere todas as linhas contendo a palavra 'next' no
arquivo '[Link]' ou no arquivo 'teste3':
grep -n next [Link] teste3
Imprima todas as ocorrências de 'ufpa' em um conjunto de arquivos:
grep ufpa arq*
cut
Função: Cortar colunas de um arquivo
Formato: cut [-fn dx cz] arquivo
Descrição
O comando cut é usado para cortar uma seção vertical de um arquivo.
Opções: -fn - indica a n-ésima coluna a ser extraída
-dx - especifica o delimitador x a ser considerado separador de
colunas. Default = tab
-cz - especifica colunas de caracteres a serem extraídas.
arquivo - arquivo de entrada
Exemplos: Corte a primeira coluna do arquivo 'telnos' e coloque-a em 'saida1':
cut -f1 telnos > saida1
Corte a segunda coluna do arquivo 'teste10' cujos separadores são
vírgulas:
cut -f2 -d, teste10
Corte uma coluna do arquivo 'teste10' composta pelos caracteres de
3 a 5 de cada linha:
cut -c3-5 teste10
Extraia o primeiro campo e do campo 3 ao 7 do arquivo 'agora':
cut -f1,3-7 agora
paste
Função: Concatenar entradas no modo coluna.
Formato: paste [-ds] arquivo...
Descrição
Combina arquivos ou entradas no formato coluna, permitindo atribuição
de delimitador.
Opções: -d - define uma delimitador diferente de tab.
-s - concatena com disposição horizontal.
Exemplos: Junte as colunas continas no 'arq1' com a contida no 'arq2':
paste arq1 arq2
Repita o exemplo anterior usando o delimitador ,:
paste -d, arq1 arq2
Concatene 'arq1' e 'arq2' na forma horizontal:
paste -s arq1 arq2
9. Conclusões
O objetivo original dos desenvolvedores do UNIX foi o de criar um
ambiente produtivo para dar continuidade à pesquisa da ciência da computação.
Esse objetivo, e muito mais, foi alcançado. Thompson e Ritchie demonstraram
que os indivíduos podem dar contribuições importantes a um campo difícil, e o
sistema operacional UNIX demonstrou que idéias novas e melhores são
eventualmente aceitas no mercado.
Em justiça a outros sistemas, observe-se que o UNIX é fraco em dois
pontos principais. O UNIX é um anarquista de nascimento. Ele funciona muito
bem se todos no sistema estiverem fazendo algo diferente, mas se complica nas
aplicações onde todos estão fazendo a mesma coisa.
A segunda fraqueza está em sistema de tempo real, que são utilizados
para controlar maquinarias, processos industriais, equipamentos de laboratório e
similares. O computador tem que reagir rapidamente enquanto as máquinas
trabalham, o processo avança ou enquanto os dados de laboratório chegam.
Certamente é possível adaptar o UNIX para executar a maioria destas
operações, mais existem outros sistemas operacionais que são melhores para
aplicações de tempo real.
Este material foi montado a partir de um curso ministrado pela IBM na
época da instalação de nossas 2 primeiras máquinas RISC e dos livros
"Entendendo o Sistema UNIX" e "Tópicos Avançados do Sistema UNIX", ambos
do Kaare Christian, editora Campus. Além disso, foram bastante úteis as notas de
aulas e conhecimentos advindos da utilização do sistema.
É um primeiro esforço do Laboratório de Informática do Campus Básico
no sentido de disseminar o UNIX na UFPA. Agradecimentos são devidos ao
Ricardo Tavares, pelo suporte dado à customização e uso do UNIX e da rede
INTERNET, da qual a UFPA faz parte desde abril/92 e, ao Aurélio Henrique
Ramalho, analista de suporte do SECOM e do Laboratório, por suas sugestões e
trabalhos desenvolvidos.