Quem tem medo do terminal? lá lá lá
Posted by marcogomez on 13 - 08 - 2010 in Blog, Linux, Mac && Apple | 1 comment
Como bem sabemos, o medo dos terminais de comando em texto puro também é fator contribuinte para a persistência do preconceito de algumas pessoas que desconhecem os sistemas operacionais GNU/Linux, que ainda acreditam que precisam dominar o controle das maquinas pelos terminais para poder utilizar tais sistemas.
Telinha preta, janelinha de texto, terminal, console, e muitos outros, são os termos que mais costumo ouvir de usuários que não tem muita familiaridade com esse recurso. Ouço muito “bah… não saberia usar o Linux… não sei usar aquela janelinha de texto…”. Atualmente temos muitas distribuições Linux em que o usuário pode fazer tudo através da interface gráfica, sem a menor necessidade de utilizar o terminal. Porém, muitos de nós que usamos o Linux há muito tempo, já nos acostumamos a realizar tarefas de maneira mais rápida pelo terminal. E as vezes realmente o domínio dessa interface pode realmente tornar mais fácil, flexível e direta a administração do sistema.
Pois bem… Minha intenção com esse post é desmistificar um pouco os terminais para aqueles que ainda não conhecem bem seus recursos, e passar algumas dicas, comandos e short-cuts legais, até mesmo para aqueles que já o conhecem porém não utilizam. Não pretendo de forma alguma me aprofundar tecnicamente no assunto, pois o mesmo é MUITO vasto, e mesmo com ANOS de estudo sobre ele, sempre se aprende alguma coisa nova… resumindo, é digno de um blog exclusivo para o assunto. Por isso, apenas quero abordar o assunto de forma a incentivar o estudo do usuário por sí só, e a pesquisa em prol do domínio da ferramenta. Vamos ao que interessa…
Shell (ou terminal), é simplesmente uma interface de comando. É um interpretador que atua entre o usuário e o complexo “cérebro eletrônico” à sua frente, traduzindo seus comandos e expressões de forma que o sistema possa entender qual a tarefa desejada e então executá-la. Simples não? Podemos dizer de forma mais superficial e genérica que os terminais são interpretadores de comandos. Quando utilizamos a interface gráfica para manipular arquivos, por exemplo, temos o ambiente gráfico em questão passando todas as instruções para o sistema do que deve ser feito… mas muitas vezes, as tarefas mais comuns previstas pelo desenvolvedor do ambiente gráfico não são o bastante, e queremos realizar de uma só vez, ações ou combinações mais complexas de tarefas, e é nessa hora que o terminal se torna necessário. Você pode utilizar sua interface gráfica para pegar todos os arquivos de um diretório e mover para outro diretório… mas, por exemplo, quando o que você quer é pegar todos os arquivos de um diretório cujos nomes comecem com a letra E, DESDE QUE não existam num segundo diretório especificado, e copiá-los para uma outro diretório comprimindo automáticamente cada um para dentro de arquivos .tar.bz2… Ai a tarefa se torna mais complicada não é mesmo? E não podemos fazer de maneira automatizada com a interface gráfica… não ao menos numa tacada só. Mas utilizando alguns recursos da shell combinados numa única linha de comando, ou então num bash script, você pode. Além disso, a shell é extremamente necessária em sistemas dedicados, em que uma interface gráfica consumiria recursos da máquina sem necessidade. Se você possui uma máquina que vai simplesmente atuar como um servidor dedicado para alguma função específica, provavelmente é mais interessante permitir que TODOS os recursos da máquina estejam disponíveis para o serviço desejado, sem consumir processamento ou memória com inferfaces gráficas.
Existem diversos interpretadores de comando disponíveis em sistemas Linux ou quaisquer outros sistemas Unix-based, dentre os quais podemos destacar os seguintes:
- sh – ou Bourne Shell foi desenvolvido por Stephen Bourne dos laboratórios AT&T em 1977 para substituir o Thompson Shell no sistema Unix versão 7. Por ser um shell robusto, e também por ser distribuido com o Unix 7 que era muito popular em Universidades, o Bourne shell logo se tornou um shell muito popular para contas Unix. Ainda permanece como o shell padrão para o superusuário (root) em muitas distribuições de sistemas Unix-like;
- bash – ou GNU Bourne-Again Shell é um interpretador multiplataforma (POSIX) desenvolvido por Chet Ramey para o Projeto GNU da Free Software Foundation, que se tornou padrão em várias distribuições Linux, podendo ser usado também em qualquer outro sistema operacional Unix-like compatível com a família de normas POSIX. O bash é compatível com o Bourne Shell e incorpora os melhores recursos do csh e do ksh (descritos abaixo);
- csh – ou C Shell, desenvolvido por Bill Joy da universidade de Berkeley e derivado da sexta geração do Thompson Shell (antecessor do Bourne shell), teve sua sintaxe modelada segundo a linguagem de programação C, e adicionou ao sh recursos como aliases e histórico de comandos. Atualmente está em desuso por ter sido superado por outros shells mais evoluidos que também implementam tais recursos;
- tcsh – ou Tenex C shell, foi um shell baseado originalmente no csh, que adicionou ao mesmo complementação de nome de arquivos e edição de linhas de comando (funcionalidades presentes no ksh (descrito abaixo) e parcialmente no bash);
- ksh – ou Korn Shell, desenvolvido por David Korn do Bell Labs, é um shell com retroativamente compatível com o Bourne Shell que além de possuir todas as funcionalidades do sh e agrega também muitas outras funcionalidades do C shell (tais como histórico de comandos, Arrays associativas e aritmética nativa de ponto flutiante), que permitem que o mesmo seja utilizado como uma linguagem de programação.
Nos sistemas Linux, e em muitos outros que também são “Unix-like” (similares ao Unix) ou “Unix-based” (baseados em Unix), todos os usuários do sistema tem um shell associado a sua conta de usuário. Isso quer dizer que se você é um usuário Linux, você possui nas configurações de sua conta pessoal no sistema um interpretador shell padrão que será utilizado quando você abre um terminal na interface gráfica, ou quando faz o login no sistema em modo texto. Por serem o bash e o sh compatíveis, e praticamente o padrão usado nas atuais distribuições Linux, usarei o bash como referência em dicas e comandos desse post.
O bash permite execuções de comandos e expressões regulares (pretendo abordar futuramente) direto no prompt do sistema ou escritas sequencia em arquivos de texto (que você pode criar com qualquer editor de texto puro de sua preferência) conhecidos como shell scripts (ou bash scripts no caso específico deste interptetador). Para que um bash script possa ser executado, o mesmo deve receber atributo de executável, através do comando chmod:
su -c chmod +x nomedoseuscript
O su -c é necessário para que você execute o comando em nível de superusuário (root).
Pronto. Feito isso, seu arquivo já se tornou um script executável através da linha de comando.
Basta digitar, no diretório em que seu script está:
./nomedoseuscript
Segue um exemplo bem simples de bash script:
#!/bin/bash
#o comando abaixo exibirá uma variável global de ambiente
echo "Olá $USER"
echo "O diretório pessoal de sua conta de usuário é $HOME"
echo "Você está utilizando o interpretador de comandos $SHELL como sua shell"
Esse exemplo representa bem a indicação do interpretador de comandos a ser utilizado pelo bash script (que ocorre na primeira linha do script), e a utilização de uma variável de ambiente para exibir informações como o nome do usuário ($USER) que logou no sistema na sessão em que o script foi executado, o diretório pessoal ($HOME) do usuário logado, e o caminho e nome do interpretador de comandos ($SHELL) que está sendo utilizado. Podemos notar também uma linha de comentário no exemplo, que utiliza o # no início da linha pra dizer ao interpretador de comandos para ignorar a linha (lembre-se que o interpretador não ignora o #! pois ele indica, logo no incício do script, o interpretador a ser utilizado).
Aproveitando ainda o exemplo, vou falar um pouco sobre variáveis de ambiente… São variáveis presentes no seu ambiente shell, que permitem que você resgate valores específicos que estão associados a elas, tais como seu nome de usuário, nome de sua máquina, interpretador shell padrão de sua conta de usuário, seu path (path é uma lista de diretórios onde seu sistema procura por arquivos executáveis para que você possa executá-los diretamente de qualquer outro diretório sem fazer referência ao caminho completo onde os mesmos se encontram), sua home (diretório pessoal de sua conta de usuário), e muitos outros valores, que também podem ser atribuidos em variáveis definidas durante a execução de seu próprio script. Para obter uma lista completa das variáveis que estão atualmente declaradas em seu ambiente, você pode utilizar o comando env combinado com o comando less, conforme o exemplo abaixo:
env | less
O comando env mostra todas as variáveis declaradas no ambiente, e o comando less serve para apresentar o resultado do primeiro comando de maneira que usuário possa “navegar” pelo texto com as setas do teclado em casos em que o resultado a ser exibido na tela excede o limite de linhas que o usuário consegue ver simultaneamente em seu monitor ou janela de terminal. Já o | (pipe) serve justamente para combinar dois ou mais comandos. Ele conecta a saida padrão do comando anterior com a entrada padrão do próximo comando. Vamos observar outro exemplo da utilização do pipe:
cat ~/casa.txt | grep movel
O comando cat serve para exibir na tela o conteúdo de um arquivo. Neste caso, o | (pipe) está conectando a saída do comando cat com a entrada do comando grep, que por sua vez serve para procurar dentro de um determinado conteúdo e exibir as linhas que contenham o termo especificado no comando. Pra quem não sabe, o ~ (tio) serve apenas para designar de maneira mais rápida e prática o caminho do diretório pessoal do usuário que está executando o comando… Portanto, se você está logado como juca, escrever o ~ no comando é o mesmo que escrever /home/juca. O resultado desse comando portanto será a exibição na tela de todas as linhas que contenham a palavra “movel” dentro do arquivo “casa.txt” localizado no diretório pessoal do usuário que executou o comando. Simples não?
Aproveitando que estamos tratando de alguns comandos Linux/Unix, segue abaixo uma lista dos principais e mais importantes comando que você pode usar na shell, com suas respectivas finalidades:
ls – lista o conteúdo do diretório;
cd – vai para um determinado diretório;
cp – copia arquivos ou diretórios (para copiar diretórios, usar a opção -r);
mv – move ou renomeia arquivos ou diretórios;
rm – deletar arquivos ou diretórios (para deletar diretórios, usar a opção -rf).
mkdir – cria diretórios;
rmdir – deleta diretórios;
ln -s – cria links simbólicos (symlinks) para arquivos ou diretórios;
file – determina o tipo de um arquivo;
cat – exibe o conteúdo de um arquivo;
head – exibe as primeiras linhas de um arquivo;
tail – exibe as últimas linhas de um arquivo;
less – lista o conteúdo de um arquivo permitindo que o usuário “navegue” pelo seu conteúdo para poder ler arquivos grandes;
more – funciona como o less, porém em vez de navegar linha a linha, o more mostra página por página fazendo pausas ao fim de cada uma;
man – exibe instruções de utilização de um comando;
reboot – reinicia o sistema;
shutdown -h now – desliga o computador;
stty -a – lista configurações do terminal;
w – exibe informações gerais sobre usuários logados e seus processos ativos;
who – exibe informações dos usuários atuais (utmp);
last – exibe o histórico de logins no sistema (/var/log/wtmp);
lastlog – exibe informações sobre últimos logins;
df -h – exibe o espaço livre e ocupado nas partições do sistema;
du -sh – exibe o espaço ocupado pelo diretório e seus subdiretórios;
free – exibe informações sobre a ocupação da memória RAM e swap;
vmstat – exibe o status da memória virtual (processos, cpu);
lsdev – exibe uma listagem do hardware da máquina;
lspci – exibe uma listagem dos dispositivos de hardware PCI da máquina;
lsusb – exibe uma listagem dos dispositivos de hardware USB da máquina;
pnpdump – exibe informações sobre as placas ISA PnP da máquina;
lsmod – exibe informações sobre módulos na memória;
rmmod – remove módulos da memória;
procinfo – exibe informações sobre os processos ativos na máquina (funciona como o comando cat /proc )
top – mostra em tempo real informações sobre os processos ativos e seu consumo;
xdpyinfo – exibe informações sobre o servidor X (servidor gráfico);
showrgbq – exibe o banco de dados das cores RGB com seus respectivos nomes;
xlsfonts – exibe o nome das fontes reconhecidas pelo servidor X;
xset – ajusta certos parâmetros do servidor X, tais como screen-saver, velocidade do mouse, etc;
jobs – exibe os processos rodando em background e em foreground;
bg – manda um processo ativo para background;
fg – manda um processo em background para foreground;
nice – altera prioridade de um processo;
renice – altera prioridade de um processo;
ps -auxw – lista todos os processos do sistema:
time <comando> – executa um comando calculando o tempo decorrente entre o início e o fim desse comando;
kill <id> – mata um determinado processo;
killall <id> – mata um determinado processo (também pode ser utilizado com o nome do processo ao invés da ID;
kill -HUP <id> – reinicia um determinado processo (também pode ser utilizado com o nome do processo ao invés da ID;
Bem, esses são os comandos mais importantes. Gostaria de ressaltar que o comando man <nome_do_comando> serve justamente para que você aprenda melhor a utilizar qualquer um desses comandos.
Lembre-se também, que você pode concatenar comando utilizando o | (pipe) ou o && ( “e” comercial) como foi dito antes, e você pode também utilizar redirecionamentos, tais como o > e o >> . Vou exemplificar como funciona na prática…
ls /home/juca > lista.txt
Esse comando irá criar o arquivo lista.txt cujo conteúdo será o resultado do comando ls /home/juca . Ou seja, o redirecionamento > fez com que o resultado do primeiro comando fosse direcionado para o arquivo especificado após o > . Agora você tem um arquivo lista.txt que contém uma lista em texto com o conteúdo do diretório /home/juca. Simples não?
Já se você utilizar o comando:
ls /home/juca/imagens >> lista.txt
Você irá, com esse redirecionamento ( >> ) concatenar no fim do arquivo lista.txt, o resultado do comando ls /home/juca/imagens… Ou seja, este novo redirecionamento não vai criar o arquivo, mas sim adicionar o resultado do primeiro comando no final do arquivo já existente.
Simples não?
Agora vamos falar um pouco sobre metodos de localização de arquivos via shell no Linux… Segue uma lista com os principais comandos para esse propósido:
updatedb – Cria ou atualiza um banco de dados com informação sobre todos os arquivos e diretórios presentes no sistema (deve ser executado com permissões de super-usuário / root);
locate <arquivo> – localiza um determinado arquivo ou diretório no sistema, e exibe o caminho completo de sua localização;
find – localiza arquivos em locais determinados de acordo com vários critérios, como por exemplo:
find /home/juca -name “*.jpg” – Exibe todos os arquivos de extensão jpg localizados no diretório /home/juca;
find /home/juca -size +3000k – Exibe todos os arquivos do diretório /home/juca que possuem mais de 3MB de tamanho;
E assim por diante…
Segue agora uma pequena lista de comandos utilizados para manipular informações em arquivos de texto:
diff – compara dois arquivos;
ispell -d br – verfica ortograficamente um arquivo de texto utilizando o dicionário em português;
sort – ordena um arquivo de texto (em ordem alfabetica, crescente, etc. – lembre-se que, assim como na maioria dos comandos de manipulação de texto, você pode utilizar sort arquivo > arquivo2 para criar um segundo arquivo com o resultado ordenado… ou seja, usar redirecionamento para que a exibição do resultado do comando seja jogada pra dentro de um determinado arquivo);
uniq – exibe um arquivo de texto removendo linhas duplicadas da exibição;
cut – exive uma área delimitada de um arquivo de texto (exemplo: cut -c3 exibe o terceiro caracter do texto);
wc – conta linhas, palavras e bytes de um arquivo de texto;
fold – ajusta o arquivo de texto para uma largura determinada;
nl – exibe as linhas de um arquivo de texto numeradas;
fmt – reformata linhas de um arquivo de texto;
expand – converte os espaços de um arquivo de texto em tabulações;
unexpand – converte as tabulações de um arquivo de texto em espaços simples;
tr – remove ou substitui caracteres de um arquivo de texto (exemplos tr -d j-m remove todas as letras que ficam entre o j e o m no alfabeto do arquivo… tr n-p N-P torna todas as letras entre o n e o p no alfabeto maiúsculas…);
Bem, este post já está ficando muito longo, e acredito que o que foi dito até agora já deve dar um empurrãozinho para aqueles que gostariam de aprender mais sobre a shell, e sobre a utilização de comandos em modo texto no Linux ou em outros sistemas Unix-based…
Para quem quiser se aprofundar no assunto, recomendo MUITO qualquer tipo de material do nosso amigo Aurélio Marinho Jargas (@oreio – twitter), Brasileiro, ESPECIALISTA em shell scripting, expressões regulares, e desenvolvimento de software. Além de ter publicados ótimos livros sobre shell scripting e expressões regulares, o Aurélio nos presenteou a todos com o famoso Canivete Suíço do Shell, que é o tipo de leitura PERFEITA pra você que quer estudar sobre o assunto.
Espero que tenham gostado.
Um grande abraço a todos e até a próxima.
One comment
Trackbacks/Pingbacks
- Terminal no MacOS e o Homebrew | AptScience.org - [...] (caso não tenha muita familiaridade com ambiente shell, recomendo que leia meu artigo “Quem tem medo do terminal? lá ...

Oi Marco,
Pô, tá show de bola mesmo teu blog, parabéns!
Visual bacana, escurão, que lembra o terminal. A formatação dos textos está legal, com negritos nos lugares certos, fica bom de ler. O textos também gostei, estão bem escritos e longos, bom para quem procura informações e não somente resumos. Você foi fundo no assunto, isso está cada vez mais raro nos blogs, infelizmente…
Tá massa mesmo, continua nessa linha de terminal, unix, mac que é um diferencial bacana. Geralmente ou se fala de terminal ou de Mac.
A única crítica é que o visual está cansando depois de um tempo de leitura. Talvez melhorasse se aumentar a letra ou torná-la mais visível (branca em vez de cinza), ou ambos.
Ah, e muito obrigado pela citação e pela indicação do meu site e livros, gostei