Escolar Documentos
Profissional Documentos
Cultura Documentos
à linha de comando
do Linux
Uma abordagem prática
1a edição
RASCUNHO
São Paulo
8 de fevereiro de 2024
RASCUNHO
Sumário
prefácio v
1 introdução 1
2 comandos básicos 3
§2.1 Sistema de arquivos, 3. §2.2 Histórico de comandos , 13. §2.3 Diretórios do sis-
tema operacional, 14. §2.4 Permissões de acesso, 14. §2.5 Estatística de arquivos e
diretórios, 16. §2.6 Caracteres especiais, 17. §2.7 Teclas de atalho, 18.
3 redirecionamento 21
§3.1 Redirecionamento da saída padrão , 21. §3.2 Operador de anexação, 21. §3.3 Redi-
recionamento da entrada padrão, 22. §3.4 Redirecionamento da saída de erro padrão, 22.
§3.5 Redirecionamentos simultâneos, 23. §3.6 Combinando ferramentas de linha de comando, 23.
§3.7 Executando um comando após o outro: o conceito de pipeline, 24.
RASCUNHO
processos
§4.1 Executando processos em segundo plano, 27. §4.2 Sendo legal com outros usuários:
o comando nice, 28. §4.3 Medindo o tempo de execução: o comando
/usr/bin/time, 29. §4.4 Execução condicional de um processo, 31. §4.5 Listando
processos, 31. §4.6 Matando processos, 32. §4.7 Parando processos, 32. §4.8 Substi-
27
tuição de comandos , 33. §4.9 Subshells , 33. §4.10 Deixando seus processos rodando...
mesmo sem estar logado!, 33. §4.11 Agendando seus comandos para serem executados
em outro momento, 34.
5 tratamento de arquivos 35
§5.1 Visualizando o conteúdo de arquivos, 35. §5.2 Contando linhas, palavras e caracteres, 36.
§5.3 Gerando sequências numéricas, 36. §5.4 Sobre cabeças e rabos, 37. §5.5 Ordenação
de linhas, 38. §5.6 Trabalhando com colunas, 38. §5.7 Busca de expressões: o comando
grep, 40. §5.8 Substituição de expressões, 40. §5.9 Busca por arquivos, 41. §5.10 Com-
pactação e descompactação de arquivos, 42.
6 informações do sistema 45
§6.1 Uso de apelidos para comandos, 46. §6.2 Carga do sistema, 46. §6.3 Memória, 46.
§6.4 Processos, 47.
iii
7 acesso remoto 49
§7.1 ssh, 49. §7.2 scp, 49. §7.3 sshfs, 49.
8 scripts em bash 51
§8.1 Os cinco tipos de ferramentas de linha de comando, 51. §8.2 O shabang, 51. §8.3
Variáveis de ambiente, 51. §8.4 A estrutura de repetição for, 52.
9 outros tópicos 53
§9.1 Buscando ajuda, 53. §9.2 Configuração do Bash, 55. §9.3 Jogos em modo texto, 55.
RASCUNHO
Prefácio
Esta apostila é voltada para o ensino da linha de comando do Linux a partir de concei-
tos iniciais básicos, ideal para quem nunca teve contato com o assunto. O conteúdo
é mostrado de forma prática, por meio de exemplos completos que podem ser execu-
tados diretamente em um console. Os comandos usados, por serem essenciais, estão
presentes em praticamente qualquer distribuição Linux, geralmente não exigindo a
instalação de pacotes adicionais além dos que já vêm instalados por padrão. O shell
usado será o bash (Bourne again shell), que geralmente é o shell padrão na maioria
das distribuições Linux.
RASCUNHO
v
RASCUNHO
Introdução
1
sistema operacional é o componente de software que faz a interface básica entre
O os programas de usuário e o hardware. Os principais sistemas operacionais em
uso atualmente são o Linux, o Windows e o MAC/OS. O Linux foi desenvolvido pelo
finlandês Linus Torvalds e seu código-fonte pode ser usado, modificado e distribuído
livremente.
Existem diversos tipos de distribuições Linux, algumas mais amigáveis (voltadas
para usuários domésticos), outras mais estáveis (voltadas para servidores) e ainda ou-
tras voltadas para áreas específicas, como educação, design gráfico, bioinformática ou
que facilitem a transição de um usuário que está acostumado com o Windows. Uma
das distribuições mais conhecidas é o Ubuntu, a qual também é usada para gerar ou-
tras distribuições, como o Kubuntu, que contém o mesmo conjunto de programas do
Ubuntu mas que usa o KDE para gerenciamento de janelas em vez do Gnome, que
RASCUNHO
vem por padrão.
O Linux é o componente central (núcleo, kernel) do sistema operacional. A parte
com que o usuário geralmente lida mais diretamente são os programas, tais como
editores de texto, planilhas eletrônicas, navegadores da internet, tocadores de música
e jogos. Todos esses programas usam o sistema operacional como um intermediário
para ter acesso ao hardware e executar suas funções.
O programa que serve de interface entre o usuário e o Linux é chamado de shell
(concha, em inglês). É como se o shell escondesse a complexidade do kernel por
meio de abstrações que possam facilmente ser gerenciadas pelos usuários, assim como
uma concha esconde uma pérola em seu interior. O shell pode se mostrar como uma
interface gráfica (graphical user interface, GUI), que usa imagens, ícones e janelas, ou
como uma interface de linha de comando (command line interface, CLI), que fornece
apenas o modo texto para interação, a chamada tela preta.
A interface gráfica é uma maneira confortável e agradável de se usar um computa-
dor com Linux. Porém, o verdadeiro poder deste sistema operacional está na linha de
comando. Há um ditado que diz “interfaces gráficas tornam tarefas fáceis mais fáceis
ainda enquanto que interfaces por linha de comando fazem com que tarefas difíceis se
tornem possíveis de serem realizadas”.
Não obstante, quando se tem acesso a um servidor Linux, a chance de que a inter-
face de linha de comando seja a única disponível é enorme. Essa é uma realidade para
a área de Bioinformática, por exemplo, para a qual saber operar um computador com
Linux instalado passa a ser um pré-requisito.
1
2 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
Exercícios
① Escreva o nome de todos os sistemas operacionais de que você já ouviu falar.
② Escreva o nome de todas as linguagens de programação de que você já ouviu falar.
RASCUNHO
Comandos básicos
2
sinal de cifrão ($) que aparece na linha em que digitamos os comandos é cha-
O mado de prompt. Ele sinaliza que o sistema está “pronto” para receber coman-
dos. Geralmente, a linha do prompt contém outros dados, tais como o nome do usuá-
rio, o nome da máquina, o diretório atual de trabalho e, às vezes, o horário atual. Pelo
fato de tais dados serem irrelevantes para o aprendizado dos comandos e poderem
variar, adotamos a exibição apenas do cifrão seguido do sinal de maior.
$>
Todo usuário é identificado no sistema através de seu nome de usuário (username
ou login name). Para certificar-se de seu nome de usuário use o comando whoami
(do inglês who am I?, “quem sou eu?"). Entenda por usar um comando digitá-lo no
prompt da linha de comando e finalizar com <ENTER>. O comando whoami devolverá
o nome do usuário que está executando o comando.
RASCUNHO
$> whoami
pires
A qualquer momento em que você achar necessário “limpar” a tela, faça uso do
comando clear.
$> clear
Se por algum motivo seu terminal ficar confuso e estranho, todo bagunçado, mos-
trando caracteres de símbolos em vez das letras que você digita, ou até não mostrando
nada do que é digitado, reinicialize-o com o comando reset.
$> reset
Esse comportamento do terminal pode ocorrer após se ter tentado visualizar um ar-
quivo binário, por exemplo.
3
4 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
$> pwd
/home/pires
$> ls
O comando mkdir exige a passagem de pelo menos uma palavra, que é o nome do
diretório a ser criado. Não se pode usá-lo sozinho como fizemos com os comandos
whoami e pwd. Dizemos que o comando mkdir exige a passagem de um parâmetro e
RASCUNHO
que sua sintaxe é:
mkdir <DIRETÓRIO>
$> cd curso
Pode-se ver que após a execução deste comando o diretório de trabalho atual passa
a ser /home/pires/curso. Note como cada diretório é separado por um caractere
‘/’.
$> pwd
/home/pires/curso
No lugar de executar cada comando em uma linha, é possível executar os dois coman-
dos em uma mesma linha. Para tanto, usa-se o ponto-e-vírgula (“;”) para separar os
comandos.
$> ls
curso
$> cd Curso
bash: cd: Curso: No such file or directory
$> CD /home/pires
CD: command not found
$> cd ..
/home/pires
RASCUNHO
É possível criar mais de um diretório com um único comando mkdir. Para isso,
basta passar os nomes dos diretórios como argumentos adicionais.
$> cd curso
$> mkdir linux libras arabe
Às vezes uma linha de comando possui tantos caracteres que fica muito comprida
para caber em apenas uma linha. Geralmente os terminais lidam bem com isso, mo-
vendo o ponto de inserção para a linha seguinte e voltando para a primeira coluna.
No entanto, você mesmo pode escrever um comando que continua por várias linhas,
bastando para isso terminar cada linha a ser continuada com o caractere \, chamado
de barra invertida.
O sinal “maior que” (>) é chamado de prompt secundário e indica que a linha é uma
continuação da anterior. É importante garantir que o sinal ‘\’ não esteja incluído em
uma string, certificando-se de “fechar” todas as aspas, simples ou duplas (' ou ") para
só então usar o símbolo ‘\’.
6 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
RASCUNHO
$> mkdir -p linux/capitulo1/exercicio
Note que se tentássemos executar este comando sem a opção -p obteríamos um erro,
pois o diretório-pai “capitulo1” ainda não existe.
$> rmdir linux/capitulo1/exercicio
$> rmdir linux/capitulo1
$> mkdir linux/capitulo1/exercicio
mkdir: cannot create directory ‘linux/capitulo1/exercicio’: No
such file or directory
As opções de um comando, também chamadas de “flags” ou “switches”, podem
ter duas formas:
curta Geralmente indicada pelo uso de apenas um hífen, usa somente um caractere
para indicar a opção usada. Exemplo: a opção -p do comando mkdir vista
anteriormente.
longa Geralmente indicada pelo uso de dois hífens, descreve com palavras inteiras a
opção usada. Exemplo: a opção --parents do comando mkdir, que é a versão
longa da opção -p.
É comum usarmos duas ou mais opções ao mesmo tempo para um comando. A
opção --verbose (ou -v) do comando mkdir, por exemplo, ativa o modo verboso,
que envia mensagens ao terminal a cada ação executada.
CAPÍTULO 2. COMANDOS BÁSICOS 7
A versão longa das opções é útil para deixar claro o significado de cada uma.
Porém, quando já se conhece bem o significado de cada opção, torna-se enfadonho (e
até parece perda de tempo) ter de digitar tudo. Assim, é comum fazer um uso mais
constante das variações curtas das opções. Seguindo na linha de “quanto menos se
digitar melhor”, diversos comandos permitem o agrupamento de versões curtas das
opções, de modo a se usar apenas um hífen.
Outros comandos, como é o caso de ps e tar, que veremos mais adiante, dispen-
sam inclusive o uso do hífen, aceitando opções em suas versões curtas diretamente.
Se quisermos visualizar a árvore de diretórios recém-criada, um mero ls não será
útil.
$> ls
linux
O comando ls lista, por padrão, apenas o diretório corrente. Para obter uma visão
geral de todo o conteúdo de um galho da árvore de diretórios, como os diretórios que
foram criados dentro do diretório linux, sem que seja necessário ficar navegando pelo
sistema de arquivos, podemos usar a opção -R (ou sua forma longa, --recursive)
do comando ls, de modo a listar os diretórios recursivamente.
$> ls -R
De forma equivalente, porém com uma visualização mais interessante, podemos usar
RASCUNHO
o comando tree.
$> tree
Caso você queira visualizar apenas os diretórios, suprimindo os arquivos, use a opção
-d do comando tree.
$> tree -d
Embora o comando rm -rf seja uma forma rápida e fácil de remover toda a árvore
de um sistema de arquivos recursivamente, trata-se de um comando extremamente
perigoso e, portanto, deve ser usado com o máximo de cautela, principalmente quando
o usuário for root.
Como iremos armazenar o conteúdo deste curso no diretório recém-criado, seja-
mos mais específicos: vamos chamá-lo de introducaoAoLinux. Para renomear um
diretório usamos o comando mv:
8 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
RASCUNHO
do sistema de arquivos. Em nosso caso, para mudar para o diretório home usando o
caminho absoluto, deve-se digitar:
$> cd /home/usuario
Um modo mais rápido é fazer uso do símbolo ~, que é um sinônimo para seu home:
$> cd ~
Um modo mais rápido ainda é usar o comando cd sem argumento algum:
$> cd
Se, no entanto, o diretório de interesse não for o do próprio usuário que executa o
comando, então ainda assim se pode fazer uso de um outro apelido, que consiste no
sinal til (~) seguido do nome do usuário no sistema (username).
$> cd ~pires
Em outras palavras, o comando acima é equivalente ao comando cd /home/pires no
caso de o diretório home do usuário pires corresponder ao caminho /home/pires.
Importante observar que o comando abaixo não altera o diretório atual para o home
do usuário pires, mas sim para o subdiretório pires dentro do diretório do usuário
que está executando o comando:
$> cd ~/pires
CAPÍTULO 2. COMANDOS BÁSICOS 9
Note que múltiplas barras consecutivas são permitidas, porém todas são reduzidas
a apenas uma. Desta forma, ////home//usuario é visto como /home/usuario
pelo sistema.
Vamos considerar agora que o diretório atual de trabalho é tão profundo quanto
/home/usuario/projeto/genoma/versao5/indice/mapeador/saida/
e que nos movemos para o diretório home com o comando cd. Após terminar a tarefa
que deveria ser feita no home, como fazermos para voltar para o diretório anterior?
Nós podemos usar o caminho absoluto:
$> cd /home/usuario/projeto/genoma/versao5/indice/mapeador/saida/
ou o caminho relativo:
$> cd projeto/genoma/versao5/indice/mapeador/saida/
$> cd -
O comando cd - sempre irá alterar seu diretório de trabalho para o que você estava
anteriormente.
Certamente a estratégia acima é útil quando, no decorrer de seu trabalho, você sai
de um diretório para outro completamente diferente e deseja voltar para o diretório
inicial. Mas, e no caso de se ter de resolver vários problemas em diversos diferentes
diretórios e depois ter de ir voltando um a um para continuar resolvendo os problemas?
Aqui, o comando cd - não será muito útil, não é mesmo? É quando, então, podemos
fazer uso de dois comandos que não são muito conhecidos: pushd e popd.
RASCUNHO
$>
$>
$>
$>
cd ~/Downloads
pushd /tmp
pushd ~/private/project/bioinformatics
popd
$> popd
A cada vez que se usa o comando pushd, o diretório atual é colocado em uma pilha
(ficando, portanto, no fundo dela) e é alterado para o diretório dado como argumento
para o comando. A pilha cresce de tamanho a cada execução do pushd. Na sequência,
cada execução do comando popd remove o último diretório inserido na pilha com o
comando pushd e altera o diretório corrente para este mesmo diretório desempilhado.
Assim, conseguimos manter um histórico dos diretórios visitados e fazer o caminho
reverso sem muito esforço.
RASCUNHO
Se o item a ser copiado é um diretório, devemos fazer uso da opção -r, de “re-
cursivo”, de modo que o comando faça a cópia de todos os arquivos do diretório e de
todos os subdiretórios (e seus respectivos arquivos) recursivamente.
$> cp -r libras /media/pires/hdBackup/
Para remover um arquivo também usamos o comando rm, porém não é necessária
a opção -r (de recursivo).
$> rm libras/notasDeAula.txt
Caso o seu sistema esteja configurado de modo que sempre é exigida uma confir-
mação da remoção, você pode “forçosamente” remover um arquivo usando a opção
-f.
$> rm -f arquivo
Se, pelo contrário, você quiser sempre ter de confirmar que realmente quer remover
um arquivo, use a opção -i, de modo a executar o comando rm interativamente.
$> rm -i arquivo
No caso de se querer sobrescrever o conteúdo de um arquivo e logo depois removê-
lo, pode-se usar o comando shred.
$> shred arquivo
CAPÍTULO 2. COMANDOS BÁSICOS 11
RASCUNHO
$> ls -a
arquivo.txt .segredo.txt
No entanto, para casos assim, geralmente é esperada uma ordenação baseada na sequên-
cia de números, evidenciando uma provável anotação de números de versão dos ar-
quivos:
file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
Essa é a chamada ordem numérica, que pode ser obtida com a opção -v do comando
ls.
$> ls -v
RASCUNHO
(ou do conteúdo dos diretórios), ela também ocorre na outra cópia. Para tanto, você
precisa criar um link simbólico com o comando ln e a opção -s.
$> pwd
/home/pires/Documents
$> ln -s /project/pires/tese.tex
opção -L: mostra sua localização atual levando em conta todos os links simbólicos
(mnemônico: logical).
opção -P: mostra sua localização atual resolvendo todos os links simbólicos (mnemô-
nico: physical).
Nota-se que o padrão, executado quando se chama o comando pwd sem opção alguma,
é a opção -L.
$> history
Essa lista de comandos permite que relembremos tudo o que foi feito e em que or-
RASCUNHO
dem foi feito. Um uso muito prático dela é a reexecução de comandos ou o uso
de um comando anterior como exemplo para o comando que se quer executar. Para
tanto, usa-se as teclas de direção “seta para cima” (↑) e “seta para baixo” (↓) para
navegar no histórico de comandos e acessar rapidamente os mais recentemente usa-
dos. Por exemplo, para entrar no diretório recém renomeado, em vez de digitar o
comando “cd cursoLinux” desde o início, podemos “resgatar” o comando já usado
“cd curso” e completar digitando apenas “Linux”.
Este é um exemplo bem inocente e que dificilmente seria usado de verdade. No
entanto, é bem comum fazer uso de comandos bastante complexos e compridos repe-
tidas vezes com apenas algumas poucas modificações. Nestes momentos, navegar no
histórico de comandos proporciona uma eficiência enorme no trabalho, seja na eco-
nomia de tempo para digitação, seja na ajuda à memória para lembrar de todos os
detalhes do comando.
Para repetir o último comando usado, tecle !!.
Se logo após executar um comando você quiser executar um outro comando muito
parecido, use o caractere ^ para fazer substituição no histórico de comandos.
$> ls *.png
$> ^png^jpeg^
$> ls -l *.jpeg
$> ^ -l^
14 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
Às vezes queremos fazer várias coisas com um mesmo arquivo. Se for o caso de
o nome do arquivo sempre ter que aparecer como último argumento dos comandos,
você pode fazer uso do comando !$.
$> cat arquivo.txt
$> vim !$
RASCUNHO
O diretório / é conhecido como diretório raiz (root em inglês) e ele é a base de toda
a árvore de diretórios do sistema de arquivos do Linux. Por base podemos entender
que é a partir dele que todos os outros diretórios e subdiretórios são criados. O dire-
tório home, por exemplo, é criado diretamente no diretório raiz e é por isso que nos
referimos a ele como /home.
Note os dez primeiros caracteres que aparecem na linha de cada item (arquivo, di-
retório ou link ) listado. Eles informam o tipo de permissão de acesso para cada um
desses itens em relação ao usuário dono do item, ao grupo ao qual o item pertence e
aos outros usuários do sistema. O primeiro caractere indica o tipo do arquivo:
- arquivo comum;
d diretório;
l link.
Os nove caracteres seguintes são divididos em três conjuntos com três caracteres
cada um: usuário, grupo e outros. Na ordem, esses caracteres possuem o seguinte
significado:
r permissão de leitura;
w permissão de escrita;
x permissão de execução.
No caso de não haver permissão para alguma dessas ações, o caractere exibido é
‘-’.
No exemplo mostrado acima, o usuário e o grupo possuem permissão de leitura e
gravação no arquivo e de leitura, gravação e execução no diretório. Os outros usuários
do sistema não possuem nenhum tipo de acesso a esses dois itens.
RASCUNHO
As permissões de acesso podem ser alteradas para as três categorias já citadas.
Também é possível usar um atalho para representar todas as três categorias ao mesmo
tempo.
O comando usado para alterar permissões de acesso é o chmod (do inglês change
mode). Sua sintaxe é:
RASCUNHO
arquivo regular com 8 bytes de tamanho. A quarta linha informa que o usuário dono
do arquivo e o grupo ao qual ele pertence possuem permissões de leitura e escrita,
enquanto os outros usuários possuem apenas permissão de leitura. Nas últimas linhas
encontramos três datas e horários:
Access Quando o arquivo foi acessado (lido) pela última vez.
Modify Quando o conteúdo do arquivo foi modificado (escrito) pela última vez.
Change Quando os metadados do arquivo foram alterados pela última vez, como por
exemplo as permissões de acesso.
Se nós “tocarmos” o arquivo com o comando touch, todas essas três datas e horá-
rios serão atualizados para a data e horário do momento de execução do touch. Esse
é um outro uso que se faz desse comando, além de criar arquivos vazios.
Caso seja de seu intuito alterar a data e o horário de um arquivo para outra data e
horário que não sejam os atuais, use a opção -t do comando touch, passando como
argumentos o mês, o dia do mês e o horário no seguinte formato: MMDDHHmm. Por
exemplo, para alterar a data e o horário de um arquivo para 20 de março às 16h00min,
faça:
$> touch -t 03201600 arquivo
Note que o comando stat aplicado a um diretório nos fornece informações se-
melhantes, valendo a pena notar que o número de blocos ocupados é 0 e que o tipo é
directory em vez de regular file.
CAPÍTULO 2. COMANDOS BÁSICOS 17
RASCUNHO
padrão, coloque-os entre colchetes.
$> ls Carolin[ae].txt
Também é possível usar uma sintaxe que expresse o complemento de um conjunto,
ou seja, todos os elementos, exceto aqueles que possuem um determinado padrão. Para
isso, basta “negar” o conjunto de caracteres iniciando a sequência com um ponto de
exclamação (!).
$> ls Carolin[!ae].txt
É possível executar mais de um comando em uma mesma linha. Para tanto, é
necessário separar os comandos com ponto-e-vírgula:
$> echo -n "Olá! O SO que estou usando é:"; uname
O comando echo imprime na tela a mensagem que é passada como argumento. Por
padrão, após a impressão o prompt é exibido na linha seguinte. Como neste caso
queremos que o nome do SO seja exibido na mesma linha, usamos a opção -n.
É possível fazer comentários na linha de comando, os quais podem facilitar o
entendimento do que está sendo feito. Os comentários são completamente ignorados
pelo Bash e são iniciados com o caractere #.
$> # Criando uma cópia de segurança.
$> cp tese.tex ~/backup # A pasta backup armazena cópias de \
arquivos importantes.
18 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
$> ls
curto.c
tamanhoMediano.txt
arquivoComUmNomeExtremamenteLongo.comUmaExtensaoTambemMuitoLonga
$> rm a<TAB>
RASCUNHO
<Ctrl + e> Move o ponto de inserção para o fim da linha.
<Ctrl + b> Volta o ponto de inserção uma letra.
<Ctrl + f> Avança o ponto de inserção uma letra.
<Ctrl + _> Volta a última ação realizada (= <Ctrl + -).
Exercícios
① Crie um diretório para dados temporários chamado tmp. Dentro dele, crie os di-
retórios teste1 e teste2. Renomeie o diretório tmp para temp. Na sequência,
remova-o.
RASCUNHO
script programas que você vai escrever para preparar os dados para a execução
do FastQC.
final resultado final.
Crie, dentro do diretório project, o diretório fastqc e, dentro dele, os diretó-
rios input, output, log, script e final.
$>
$>
$> history
$> !1990
$> ^fastq^fasta
⑦ Dê o comando para listar os arquivos cujos nomes possuem a extensão txt, o pre-
fixo user- e o restante é composto por mais um caráter (exemplos: user-a.txt,
user-9.txt).
$>
RASCUNHO
Redirecionamento
3
3.1 Redirecionamento da saída padrão
Para escrever uma mensagem no próprio terminal pode-se usar o comando echo.
$> echo "Seja a mudança que você quer ver no mundo." > \
mensagem.txt
RASCUNHO
Por padrão, a saída de todo comando é enviada para a tela. Usamos, portanto, o co-
mando de redirecionamento da saída padrão, que consiste no símbolo ‘>’, para fazer
com que tudo o que seria enviado para a tela seja enviado para um arquivo. É impor-
tante notar que, caso o arquivo não exista, ele será criado. Porém, caso o arquivo já
exista, ele será sobrescrito, de modo que é muito importante ser bastante cauteloso em
seu uso.
Confirme que o segundo texto foi anexado ao primeiro com o comando cat.
21
22 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
No exemplo acima, o programa cowsay recebe sua entrada via pipeline como sendo
a saída do programa cat. A desvantagem dessa sintaxe é que se faz necessário um
processo a mais (o do comando cat) para que a execução do programa cowsay seja
concluída. Com o uso do redirecionamento da entrada padrão, dado pelo símbolo ‘<’,
nós eliminamos a necessidade deste processo adicional.
A vantagem dessa sintaxe mostra-se quando temos que executar vários comandos em
sequência com uma mesma entrada, bastando alterar a parte final da linha de comando.
Compare essa estratégia com a que usa o histórico de comandos com o !$, apresentada
RASCUNHO
na Seção 2.2.
Note que também neste caso, se o arquivo para o qual a saída de erro padrão está
sendo redirecionada já existe, ele será sobrescrito. Para evitar a sobreposição e anexar
os erros a um arquivo já existente, deve-se usar o operador de anexação 2>>.
A ordem aqui não é importante, de modo que também podemos redirecionar primei-
ramente a saída padrão e depois a saída de erro padrão.
Assim, é possível fazer com que tanto a saída de erro padrão quanto a saída padrão
sejam gravados em um mesmo arquivo.
RASCUNHO
$> ls ~ /root 2>&1 > /tmp/ls.out # Erros são enviados para a tela.
meio da gravação e leitura de arquivos. Uma vez que o resultado esperado é apenas
o final, tais arquivos contêm resultados intermediários e são usados apenas para a co-
municação entre ferramentas diferentes podendo, portanto, ser descartados tão logo a
comunicação tenha sido concluída.
Uma outra maneira de fazer com que a saída de uma ferramenta seja a entrada de
outra é através do que chamamos pipe. Podemos traduzir pipe para cano e a analogia
é perfeita: os dados de saída de uma ferramenta entram por um lado do cano e, ao
sair pelo outro lado do cano, servem de entrada para outra ferramenta. O conjunto
das duas ferramentas e do pipe é chamado de pipeline. Há casos, no entanto, que a
saída da segunda ferramenta ainda não é o resultado final, necessitando ser processada
novamente por uma terceira ferramenta. A extensão do pipeline é natural: basta fazer
com que a saída da segunda ferramenta seja a entrada da terceira. Tal arranjo pode se
repetir muitas vezes, até que o pipeline esteja completo.
Conectar duas ferramentas através de um pipe é muito simples: basta inserir o
símbolo |.
RASCUNHO
$> seq 100 > sequencia.txt
$> head sequencia.txt
$> seq 100 | head
Lembra-se de que quando temos uma linha de comando muito comprida é possível
quebrá-la em várias linhas de comando usando o caractere \ ao final da linha? Pois o
caractere | também pode ser usado para o mesmo propósito:
$ seq 10 |
> cowsay |
> lolcat
CAPÍTULO 3. REDIRECIONAMENTO 25
Exercícios
① Use o comando echo para escrever o nome de uma comida que você gosta em um
arquivo chamado receitasAProcurar.txt.
$>
RASCUNHO
(a) Gere o arquivo ~/quinze.txt cujo conteúdo é uma listagem dos números de
1 a 15, um por linha.
(b) Sobrescreva o conteúdo do arquivo ~/quinze.txt, cujo conteúdo deve passar
a ser novamente uma listagem dos números de 1 a 15, porém com todos os
números em uma única linha, separados por um caractere de espaço.
(c) Acrescente ao final do atual arquivo ~/quinze.txt a mesma listagem solici-
tada no item (a).
RASCUNHO
Processos
4
Todo comando em execução no Linux recebe o nome de processo. Cada processo
possui um identificador único, ao qual chamaremos processID.
Para os exemplos a seguir, usaremos o comando sleep, que faz com que o prompt
de comando aguarde a quantidade de segundos solicitada até que esteja disponível para
a execução de um novo comando novamente. Para aguardar 3 segundos:
$> sleep 3
Ao executar o comando sleep com um valor bem alto, teremos que aguardar
muito tempo até que o terminal esteja disponível novamente.
RASCUNHO
Bem, a informação dada no parágrafo anterior não é de todo verdade. Veremos
nas seções seguintes o motivo.
27
28 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
combinação de teclas <Ctrl + z>. Isto fará com que o processo fique parado no
ponto em que se encontrava e o terminal é liberado para a execução de outros proces-
sos. Dizemos que o processo original ficou “suspenso”.
Após usar o terminal, você pode colocar novamente o processo original em exe-
cução com o comando fg (de foreground ).
$> fg
Isso fará com que o terminal novamente deixe de aceitar novos comandos. Essa
estratégia é boa para ser usada quando o comando que está rodando emite mensagens
ao terminal. Se, porém, o comando é do tipo “silencioso” e envia todos os seus re-
sultados para arquivos em vez de para a tela, faz todo sentido você deixá-lo rodando
em segundo plano. Contudo, às vezes nos esquecemos de digitar o símbolo & após o
comando. Nestes casos, após parar a execução do comando com <Ctrl + z>, basta
usar o comando bg (de background ).
$> bg
Isso fará com que o comando que foi parado com o <Ctrl + z> volte à execução, só
que desta vez em segundo plano e, com isso, você tem o terminal livre para executar
outros comandos.
Eventualmente, você pode ter mais de um processo suspenso ou sendo executado
em segundo plano. Para facilitar o gerenciamento desses processos existe o comando
jobs.
$> jobs
Se você quiser listar além dos identificadores de serviço (job IDs) também os identifi-
RASCUNHO
cadores dos processos (PIDs), use a opção -l.
$> jobs -l
Cada serviço suspenso ou em segundo plano está conectado ao terminal que o iniciou,
de modo que, se você deslogar, o utilitário jobs executado em outro terminal não
listará os serviços iniciados no terminal de origem.
em um núcleo e por quanto tempo cada processo ficará sendo executado até voltar
para a fila de espera e ceder o núcleo para execução de outro processo. Para fazer
essas escolhas, o escalonador de processos do Linux se baseia em duas características
que todo processo contém: prioridade e nível de nice.
O valor desses dois campos pode ser visualizado para cada processo usando os
comandos htop ou top, nas colunas PRI no htop (PR no top) para a prioridade e
NI em ambos os programas para o nível de nice (pressione a tecla q, do inglês quit,
para sair). Quanto maior a prioridade de um programa, maior a probabilidade de ele
ser selecionado para execução em um núcleo e maior o tamanho da janela de tempo
em que ele ficará executando antes de ser enviado de volta para a fila de espera. Já
o valor do nível de nice tem efeito contrário: podemos entendê-lo como o quanto o
processo é gentil, amável, simpático (nice) com os outros processos. Quanto maior
o nível de nice de um processo, mais ele cede seu lugar para que outros processos
sejam executados no lugar dele, seja sendo retirado menos vezes da fila de espera, seja
usando os recursos computacionais por janelas de tempo menores quando ele está em
execução.
Por padrão, se nada é indicado na linha de comando, os processos rodam com nice
nulo. Caso se deseje alterar o valor de nice padrão, deve-se usar o comando nice.
$> sleep 15
$> htop
$> nice sleep 15
$> htop
Ao rodar o comando nice sem argumentos, o valor de nice passa a ser 10. Para alterar
esse valor, devemos usar a opção -n.
RASCUNHO
$> nice -n 19 sleep 15
O intervalo de valores que pode ser usado como nice vai de -20 a 19. Somente o
usuário root pode usar valores negativos de nice e, nesses casos, os processos tem sua
prioridade de execução aumentada.
Para esses processos demorados, vale a pena medirmos o seu tempo de execução
pelos seguintes motivos:
• Você pode estudar quais parâmetros e quais máquinas permitem uma execução mais
rápida.
• É possível passar a ter uma ideia de, dada uma mudança no tamanho de alguma das
entradas, quanto tempo o processo levará para terminar.
Essas observações são particularmente importantes quando esses processos são co-
locados para rodar em uma máquina que é compartilhada por muitos usuários e que
possua um controle de serviços, no qual você deve indicar, antecipadamente, quais e
por quanto tempo os recursos serão usados.
A sintaxe do comando /usr/bin/time é bem simples: basta colocá-lo antes do
comando para o qual se quer medir o tempo de execução.
system Tempo gasto pelo sistema, para fazer o escalonamento de processos entre fila
de espera e fila de execução, por exemplo.
elapsed Tempo “real” de execução, o mesmo que você obteria se estivesse marcando
com um relógio.
RASCUNHO
Em sistemas multicore, é comum notar que o tempo informado como elapsed equivale
aproximadamente à soma dos tempos user e system dividida pelo número de núcleos
usados para o processamento. Nesses momentos nos damos conta que um processo
que levou duas horas para terminar usando 100 núcleos em um servidor teria levado
mais de 8 dias para ser concluído em uma máquina monoprocessada.
Para obter as informações dadas pelo comando /usr/bin/time de uma forma
mais organizada e completa, incluindo informações sobre a quantidade de memória
usada, podemos usar a opção --verbose.
A mensagem somente será exibida, ou seja, o comando cowsay somente será exe-
cutado, caso o comando ls encontre algum arquivo com a extensão txt no diretório
corrente. Caso contrário, a mensagem não é impressa.
Se, no entanto, queremos executar um comando somente se um outro comando
falhar, podemos usar o símbolo ||.
$> ps -u pires
Já para listar todos os processos de todos os usuários você pode usar o comando
ps com as opções aux (sem hífen mesmo):
$> ps aux
RASCUNHO
Para visualizar todos os processos que estão rodando no sistema com o máximo
de detalhes, use as opções -ef.
$> ps -ef
Se você também quiser incluir informação sobre cada tarefa (thread ), use a opção
-L.
$> ps -eLf
Para especificar quais atributos serão listados como saída do comando ps você
deve usar a opção o em conjunto com especificadores padrão de formato. Por exemplo,
para listar apenas o identificador do processo, o tempo de execução e o nome do
comando, com um cabeçalho em português, faça:
Consulte o manual para descobrir outros campos que podem ser usados, além de pid,
time e comm.
Uma outra forma de visualização dos processos de um sistema é dada pelo co-
mando pstree.
$> pstree
32 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
$> atop
$> htop
$> top
com acesso ao terminal Caso o comando tenha sido iniciado em primeiro plano e
você tenha acesso ao terminal dele, pode-se interrompê-lo enviando um sinal
de interrupção com a combinação de teclas <Ctrl + c>. Isto será o suficiente
para matar o processo.
sem acesso ao terminal Caso o comando tenha sido iniciado em segundo plano ou
você não tenha mais acesso ao terminal dele, você pode matá-lo com o co-
mando kill. Para tanto, você deve descobrir o identificador do processo com
o comando ps ax:
RASCUNHO
$> ps ax
Uma vez identificado, mate o processo enviando o sinal KILL (ou seu sinônimo
numérico: “-9”) com o comando kill:
4.9 Subshells
RASCUNHO
Todo comando que estiver entre parênteses será executado em um novo shell que será
criado.
$> (cd /tmp; pwd; ls)
Note que após a execução deste subshell o usuário continua no mesmo diretório que
estava antes, mostrando que o comando cd /tmp foi executado em um outro shell.
por conta algum pico (ou mesmo falta) de energia elétrica ou que sua conexão caia
devido à uma queda da internet. É para evitar problemas nesses casos que existem
técnicas que podem ser aplicadas para garantir a execução de seus processos até o
final, independentemente de seu login se manter ativo ou não no servidor.
O primeiro comando que iremos aprender como uma solução para este problema
é o nohup.
RASCUNHO
Tratamento de arquivos
5
Conforme foi discutido no Capítulo 2, os nomes de arquivos no Linux não dependem
de uma extensão. Para descobrir o tipo de um arquivo, você pode usar o comando
file.
$> file arquivo.txt
$> file imagem.jpg
$> file musica.mp3
$> file /home
Pode ocorrer de uma determinada aplicação exigir que as linhas de um arquivo
sejam processadas em ordem inversa, de baixo para cima ao invés de de cima para
baixo, ou seja, começando pela última linha e terminando pela primeira. Nesses casos,
podemos fazer uso do comando tac.
RASCUNHO
$> tac arquivo
35
36 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
Note, porém, que o comando more só permite que você visualize cada vez mais
do arquivo, seja avançando uma linha ou uma página, mas nunca permitindo voltar.
Para além de visualizar também navegar por um arquivo, podendo interagir com a
exibição de modo a mostrar as próximas páginas ou linhas ou ainda voltar o texto que
já passou, use o comando less.
Para procurar por um determinado texto a partir do ponto que está sendo visuali-
zado no arquivo com o comando less, deve-se teclar ‘/’ seguida da expressão que se
RASCUNHO
quer procurar. A expressão será procurada no texto que se encontra adiante do que é
exibido em tela.
Já no caso de se querer procurar por uma determinada expressão na parte do texto
que já foi visualizada e se encontra “acima” do que é exibido no momento, deve-se
usar a tecla ‘?’ seguida da expressão que se quer procurar.
Dar uma olhada no comando most.
$> wc arquivo.txt
Somente o “cabeçalho” composto pelas dez primeiras linhas é exibido. Caso o arquivo
contenha menos de dez linhas, somente serão impressas as linhas do arquivo (não
serão impressas linhas vazias até completar o total de linhas pedidas).
Se, por outro lado, preferirmos olhar as dez últimas linhas do arquivo, podemos
usar o comando tail.
Da mesma forma que para o comando head, o comando tail também somente exi-
birá, por padrão, as dez últimas linhas do arquivo (ou apenas as linhas do arquivo,
caso ele possua menos de dez linhas).
Se, tanto para o comando head quanto para o comando tail, quisermos visuali-
zar um determinado número de linhas, podemos usar a opção -n seguida do número
desejado.
RASCUNHO
Podemos até mesmo usar uma abreviação composta apenas pelo hífen e pelo número:
-2 neste caso.
Note que quando recebe mais de um argumento, o comando head imprime, para cada
arquivo, primeiramente o nome do arquivo para depois imprimir as 10 primeiras li-
nhas. Cada listagem é separada por uma linha em branco. Se o intuito é obter esse
mesmo efeito ao se usar o comando head com apenas um arquivo, deve-se usar a
opção -v.
O comando tail possui a opção -f (do inglês follow), a qual permite acompanhar
o crescimento do arquivo em tempo real, exibindo as linhas que são adicionadas a seu
final.
RASCUNHO
Para listar as 6 primeiras colunas de um arquivo com 6 ou mais colunas separadas
por <TAB>, use a opção -f do comando cut, separando os valores dos extremos do
intervalo com um hífen (‘-’).
$> cut -f1-6 arquivo.tsv
$> cut -f-6 arquivo.tsv
Note que o segundo exemplo usa uma forma abreviada do intervalo.
Também é possível escolher colunas isoladas e intervalos de colunas, tudo em um
mesmo comando.
$> cut -f1,3,5-8,12
O comando acima seleciona as colunas 1, 3, de 5 a 8 e 12, além de assumir que as
colunas estão separadas por caracteres <TAB>.
Pode ocorrer casos em que o interesse é selecionar de uma coluna em diante, não
importando quantas colunas há após.
$> cut -f9- arquivo.tsv
O comando acima lista da coluna 9 (inclusive) em diante de um arquivo cujas colunas
estão separadas por <TAB>.
Aplicações que exigem a seleção de colunas em uma ordem diferente da crescente,
invertendo duas colunas, por exemplo, ou a repetição de colunas, devem fazer uso da
função print do comando awk, indicando a ordem das colunas.
CAPÍTULO 5. TRATAMENTO DE ARQUIVOS 39
RASCUNHO
simples: imprime de trás para frente cada linha que recebe. Note que, fazendo isso,
não importa se não sabemos quantas colunas existem ou se cada linha possui um
número diferente de colunas: após a inversão, a última coluna da entrada original
será, certamente, a primeira. Só não se pode esquecer da necessidade de “desinverter”
o resultado ao final.
$> < arquivo.tsv rev | cut -f1 | rev
A segunda solução usa o comando awk. Nessa linguagem de programação, o
número de colunas é armazenada na variável NF (abreviação do inglês Number of
Fields, de número de campos).
$> awk ’{print $NF}’ arquivo.tsv
As duas estratégias podem ser usadas para a extração de qualquer número de colu-
nas que sejam contadas de trás para frente. Veja, por exemplo, a obtenção da penúltima
coluna:
$> < arquivo.tsv rev | cut -f2 | rev
$> < arquivo.tsv awk ’{print $NF-1}’
Esse comando irá imprimir na tela cada linha do arquivo 1_R1.fasta que contém o
padrão procurado.
Ao buscar o padrão em diversos arquivos, antes da impressão de cada linha é
impresso o nome do arquivo em que o conteúdo foi encontrado.
Se você quiser imprimir apenas o nome dos arquivos em que o padrão procurado
ocorre, use a opção -l do grep.
Para contar o número de linhas que resultou de uma busca com o comando grep,
use a opção -c. Outra opção é redirecionar sua saída para a entrada do comando
wc -l.
É muito útil usar alguns metacaracteres ao se fazer buscas com o comando grep:
RASCUNHO
$> ls | grep png$
$> ls | grep ^#
O metacaractere $, quando usado para casar padrões, casa com qualquer string que
termine com a string fornecida imediatamente à sua esquerda. Já o metacaractere ^
restringe o resultado a item que iniciam com uma determinada string.
O comando acima substitui a primeira ocorrência de ’T’ em cada linha por ’U’ no
arquivo 1_R1.fasta. Geralmente, não é o que se quer ao solicitar uma substituição:
o intuito é que a substituição ocorra a cada ocorrência do padrão, mesmo que sejam
várias ocorrências em uma mesma linha. Para isso, precisamos usar a opção g ao final
do comando de substituição.
RASCUNHO
i no nome da opção -iname é um mnemônico para o termo em inglês “ignore case”.
O comando find também pode lidar com conectores lógicos. Digamos, por exem-
plo, que você queira encontrar, a partir do diretório atual, todos os arquivos que pos-
suam extensão fa ou fna.
$> find . -name ’*.fa’ -o -name ’*.fna’
Note que no comando acima os símbolos “(” e “)” dos parênteses estão “protegidos”
(ou “escapados”) pelo símbolo \ de barra invertida (ou “contrabarra”). Isso é necessá-
rio para que eles não sejam interpretados pelo shell como um subshell, tal como vimos
na Seção 4.9.
Também é possível restringir a saída do comando find para obter apenas diretó-
rios (usando a opção -type d), arquivos (-type f) ou links (-type l).
$> find . -type d
$> find . -type f
$> find . -type l
Para executar um comando que seja aplicado a cada arquivo que for encontrado
pelo comando find, você pode usar a opção -exec. Digamos, por exemplo, que você
deseja excluir todos os arquivos que se encontrem na árvore de diretórios atual que
possuam a extensão .swp:
$> find . -name ’*.swp’ -exec rm {} ’;’
42 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
Se, no entanto, você quiser ser mais cauteloso e deseja que seja mostrado primeira-
mente cada comando a ser executado para você responder se quer realmente seguir em
frente ou recusar a execução do comando para determinados argumentos, use a opção
-ok em vez de -exec.
Digamos agora que você queira listar os arquivos que tenham tido seus metadados
(tais como posse e permissões de leitura, escrita e execução) alterados há três dias
atrás. Para tanto, você pode usar a opção -ctime do comando find.
Se você quiser listar os que tenham sofrido alteração nos últimos três dias, acrescente
o símbolo ‘-’ antes do dígito 3.
E para listar os arquivos que sofreram alteração há mais de três dias, o símbolo deve
ser o ‘+’.
Você também pode procurar por arquivos de acordo com a data em que foram lidos ou
acessados pela última vez (opção -atime) ou pela data em que foram modificados ou
escritos pela última vez (opção -mtime). Se em vez de especificar o tempo em dias
você precisar especificá-lo em minutos, use as opções -cmin, -amin e -mmin.
Outra grande utilidade do comando find é usá-lo para encontrar arquivos baseando-
RASCUNHO
se em seus tamanhos. Para tanto, use a opção -size.
Caso você queira que o arquivo seja descompactado em um outro diretório, use a
opção -d.
RASCUNHO
(em vez da entrada padrão), cujo nome deve ser informado imediatamente após
o uso da opção.
x: abreviação para extract (“extrair” em inglês), essa opção permite extrair qualquer
arquivo que esteja armazenado no tarball, realizando a devida descompactação
dos dados.
Exercícios
① Imprima na tela uma contagem regressiva de 10 a 1.
(a) Liste todos os arquivos que possuem o termo “R2” como substring em seu
nome.
(b) Dos arquivos listados no item anterior, separe os identificadores que aparecem
antes do segundo hífen (“-”).
(c) A partir da listagem do item anterior, remova as linhas repetidas.
(d) Quantos identificadores únicos (diferentes) há? Não conte: use um comando
que forneça a resposta.
RASCUNHO
os emails correspondentes a cada nome, na mesma linha. Gere um arquivo que
contenha duas colunas: os nomes na primeira e os emails na segunda.
⑥ Remova da quarta coluna todos os caracteres que aparecem após o primeiro hífen,
inclusive.
Informações do sistema
6
Para descobrir o caminho completo de um comando, ou seja, o local onde se encontra
o seu script ou o seu binário, use o comando which.
$> which ls
Caso o comando que você esteja tentando executar não seja encontrado pelo which
Você pode tentar descobrir onde ele está usando o comando whereis.
$> whereis ls
RASCUNHO
que contém uma determinada string em seu nome, use o comando locate.
Note que esse comando mostra ainda mais resultados que o comando whereis apli-
cado à própria string whereis.
De fato, esse uso mais genérico aproxima o comando locate muito mais do comando
find do que do whereis. A diferença fica por conta de que o locate usa um banco
de dados que lista todos os arquivos em disco (e que pode estar defasado) enquanto
que o find busca os arquivos em disco em tempo real. Essa estratégia faz com que o
comando locate rode muito mais rápido que o comando find; deve-se apenas estar
atento à possibilidade de não serem listados os arquivos que foram criados após a
última atualização do banco de dados.
45
46 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
$> w
$> top
$> uptime
Esses mesmos comandos informam quantos usuários estão logados no sistema e tam-
bém a carga do sistema.
A carga média é indicada pelos três valores de load average. Uma carga alta indica
que o sistema está muito ocupado na execução de processos. Quando o valor de load
average é alto, o valor de “id” na terceira linha do comando top deve ser baixo, e vice-
versa. Cada valor corresponde à porcentagem de uso da CPU durante um determinado
período de tempo. Os períodos correspondem ao último minuto, aos 5 últimos minutos
e aos 15 últimos minutos, respectivamente, para o primeiro, segundo e terceiro valor.
RASCUNHO
O comando top nos fornece ainda mais informações sobre outros tipos de carga do
sistema. O valor de wa na terceira linha, por exemplo, indica a porcentagem de servi-
ços que estão aguardando (waiting) por entrada e saída (“I/O”, do inglês input/output).
A porcentagem de tempo que tem sido gasta com interrupções de hardware e software
é indicada pelos valores de hi (hardware interruption) e si (software interruption). Já
o valor de st (de steal time) indica a porcentagem de CPU que está sendo usada para
o gerenciamento de máquinas virtuais.
É possível, inclusive, visualizar na forma de um gráfico, com o comando top, a
porcentagem de CPU que está sendo usada. Digite t uma vez para um gráfico de
linhas, t por uma segunda vez para um gráfico de barras, t pela terceira vez para
ocultar a segunda e a terceira linhas e t pela quarta vez para voltar para a exibição
padrão.
6.3 Memória
Para verificar o total de memória física disponível e o quanto dela está sendo usado,
use o comando top. A quarta linha exibe a quantidade total de memória, o quanto
dela está livre, o quanto está sendo usado e o quanto está sendo usado como buffer ou
cache.
Com relação à área de troca, a quinta linha do comando top exibe a quantidade
total de área de troca, o quanto dela está livre e o quanto está sendo usado.
CAPÍTULO 6. INFORMAÇÕES DO SISTEMA 47
6.4 Processos
O comando top exibe os processos que estão no sistema. A tabela possui diversas
colunas, cujos significados são os seguintes:
PID Número de identificação do processo.
USER Usuário dono do processo.
PR Valor da prioridade.
NI Valor do nice.
VIRT Memória virtual.
RES Memória física.
RASCUNHO
mindo, parados e zumbis no sistema. A terceira linha contém os valores de us (user)
e sy (system) que indicam a porcentagem de tempo da CPU que está sendo dividida
entre processos de usuários e processos do kernel (núcleo do sistema operacional).
Na terceira linha, o valor de ni informa a porcentagem de serviços que estão rodando
com baixa prioridade (ou seja, com nice alto).
Para visualizar a porcentagem de memória que está sendo usada no sistema como
um gráfico, digite m. Será exibido um gráfico preenchido por linhas. Digite m pela
segunda vez para um gráfico de barras, m pela terceira vez para ocultar a quarta e a
quinta linha e m pela quarta vez para voltar para a exibição padrão.
Para mostrar uma lista com os processos que são os principais consumidores de
recursos, use o comando A do top. Para entrar em sua tela de configuração, digite
f. Para selecionar interativamente um novo tipo de ordenação na lista de processos,
digite o.
RASCUNHO
Acesso remoto
7
7.1 ssh
O ssh (do inglês Secure SHell) é um programa que permite a um usuário conectar-se
a outra máquina de forma segura, usando criptografia. Você pode usar o programa
putty no Windows para conectar via SSH em uma máquina Linux. No Linux, basta
usar o comando ssh.
$> ssh pires@vital.butantan.gov.br
Note que o argumento passado como primeiro parâmetro neste exemplo é composto
por três partes: {usuário}@{computador}. Primeiramente é preciso dizer o nome
do usuário que se quer usar para fazer a conexão SSH e depois o nome da máquina
em que se quer conectar. Esses dois campos são separados pelo símbolo ‘@’.
RASCUNHO
Se o nome do usuário remoto é o mesmo do usuário local, pode-se passar como
argumento apenas o nome da máquina, que sempre deve ser completo, incluindo o
domínio.
$> ssh vital.butantan.gov.br
Também é possível usar o IP da máquina em vez de seu nome. Essa forma é muito
útil quando o DNS (Domain Name Server) não está funcionando.
$> ssh 172.25.2.25
O ssh irá solicitar a senha do usuário na máquina em que se quer conectar. Ao
digitar a senha, nada, nem mesmo caracteres ‘*’, aparecerá na tela. Isso é proposital,
pois quem por acaso estiver olhando para a tela não saberá nem mesmo por quantos
caracteres sua senha é composta.
Após entrar com a senha corretamente, será exibido o terminal da máquina remota.
7.2 scp
7.3 sshfs
Para montar uma pasta ou um sistema de arquivos via SSH:
sshfs name@server:/path/to/folder /path/to/mount/point
49
RASCUNHO
Scripts em bash
8
8.1 Os cinco tipos de ferramentas de linha de comando
ç
8.2 O shabang
É sabido que o Linux não depende de extensões nos nomes dos arquivos para saber
o tipo de arquivo com o qual se está lidando. Isso é possível graças aos chamado
magic numbers que são números colocados logo no início de um arquivo, informando
seu tipo. Já para arquivos do tipo texto, usa-se a combinação de símbolos “#!” para
informar o shell qual interpretador deve ser usado para ler o arquivo. Esse é o caso de
scripts em bash.
RASCUNHO
8.3 Variáveis de ambiente
Para criar uma variável no bash, basta realizar uma atribuição com o símbolo =.
$> NOME=Maria
$> NAME="Linux"
$> echo NAME
NAME
$> echo $NAME
51
52 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
Linux
$> echo ’NAME’
NAME
$> echo "NAME"
NAME
$> echo ’$NAME’
$NAME
$> echo "$NAME"
Linux
Podemos notar que ao usar aspas simples, o conteúdo envolto por elas é passado da
forma como está, sem nenhuma interpretação por parte do shell. Já no caso das aspas
duplas, o conteúdo é interpretado no sentido de expandir os valores das variáveis. Esse
é o mesmo comportamento que notamos na Seção 4.8, em que tratamos da substituição
de comandos.
Tão logo um usuário ganha acesso a um sistema, diversas variáveis de ambiente
são definidas para ele. O próprio texto que é exibido no “prompt” da linha de comando
é definido por uma variável de ambiente, chamada PS1. Nela, alguns códigos são
usados para expansão de outras variáveis. Por exemplo, \u é expandido para o nome
do usuário e \h é expandido para o nome da máquina (’h’ de host). Faça um teste e
altere o valor dela.
$> echo $PS1
$> PS1="\u@\h \$ "
$> echo $PS1
RASCUNHO
8.4 A estrutura de repetição for
Eventualmente precisamos realizar uma mesma tarefa com diferentes entradas. Faz-se
necessária uma estrutura de repetição, que receba uma lista com as entradas e permita
facilmente repetir os mesmos comandos em cada item da lista.
Outros tópicos
9
9.1 Buscando ajuda
Desde o usuário iniciante até o mais experiente, vez ou outra se faz necessária a con-
sulta a algum sistema de ajuda. Seja para aprender mais sobre algum comando, des-
cobrir novas opções ou simplesmente para se lembrar da sintaxe, existem diversas
formas de se buscar ajuda no próprio sistema.
Para saber onde se encontra o binário, o manual, o info e o código-fonte de um
comando, use o comando whereis.
Se for encontrado mais de um binário para um mesmo comando, o que será exe-
cutado por padrão será o primeiro que aparecer ao se seguir a ordem dos diretórios
RASCUNHO
determinada pela variável de ambiente PATH. Para você saber o caminho absoluto do
executável selecionado, use o comando which.
O comando mais comum para obter ajuda na linha de comando é o man, abreviação
de manual. Ele mostra a seção do manual, uma descrição sobre o que o comando faz,
sua sintaxe, a lista de opções, exemplos de uso e sugestões de outros manuais de
comandos relacionados. O manual do comando ls, por exemplo, pode ser consultado
com o comando a seguir:
$> man ls
Para abrir o manual em uma determinada seção, é preciso especificá-la como pri-
meiro argumento, de modo que o comando para o qual se quer consultar o manual
passa a ser o segundo argumento.
$> man 7 ip
53
54 INTRODUÇÃO À LINHA DE COMANDO DO LINUX
$> whatis ls
$> man -f ls
Para fazer busca nos nomes das páginas e nas descrições, use o comando apropos
(equivalente a man -k).
$> apropos ls
$> man -k ls
Para alguns comandos, há seções com descrições mais amigáveis, como se fosse
um livro, as quais são acessadas através do comando info. Serve mais para aprender
do que para consultar. O mais indicado para consultar é o man.
$> info ls
$> ls --help
RASCUNHO
$> man 1 printf
$> man 3 printf
Uma outra forma de buscar por ajuda é por meio da execução do comando help.
$> help cd
No entanto, ele só funciona para alguns comandos populares que possuem versões
chamadas built-in. Para outros tipos de comando, como o ls, obtém-se uma mensa-
gem de erro.
$> help ls
bash: help: no help topics match ‘ls’. Try ‘help help’ or ‘man
-k ls’ or ‘info ls’.
Para obter uma listagem dos comandos built-in, execute o comando help sem
nenhum argumento.
$> help
CAPÍTULO 9. OUTROS TÓPICOS 55
RASCUNHO
Também há um conjunto de teclas de atalho para navegar entre nós da página info:
n Para ir para o próximo nó (do inglês next).
p Para ir para o nó anterior (do inglês previous).
u Para mover para um nó acima no índice (do inglês up).
Explorar o comando cheat (e dar uma olhada no tldr).
nsnake
greed
bsdgames
moon-buggy
ninvaders
bastet
pacman4console
RASCUNHO
Exercícios
① Estude o manual do comando seq e descubra como imprimir na tela a contagem
de 20 a 40 listando, porém, apenas os números pares.