Comandos e operadores do Bash

Concluído

Todas as linguagens de shell têm os seus comandos mais utilizados. Vamos começar a criar o seu repertório do Bash ao analisar os comandos mais utilizados.

Comandos do Bash

Vejamos os comandos comuns do Bash e como utilizá-los.

Comando ls

O comando ls apresenta o conteúdo do seu diretório atual ou o diretório especificado num argumento para o comando. Por si só, apresenta os ficheiros e os diretórios no atual diretório:

ls

Os ficheiros e os diretórios cujos nomes começam com um ponto final são ocultos por predefinição. Para incluir estes itens numa listagem de diretórios, utilize o sinalizador -a:

ls -a

Para obter ainda mais informações sobre os ficheiros e os diretórios no diretório atual, utilize o sinalizador -l:

ls -l

Eis uma saída de exemplo de um diretório que contém vários ficheiros JPEG e PNG, bem como um subdiretório com o nome gifs:

-rw-rw-r-- 1 azureuser azureuser  473774 Jun 13 15:38 0001.png
-rw-rw-r-- 1 azureuser azureuser 1557965 Jun 13 14:43 0002.jpg
-rw-rw-r-- 1 azureuser azureuser  473774 Mar 26 09:21 0003.png
-rw-rw-r-- 1 azureuser azureuser 4193680 Jun 13 09:40 0004.jpg
-rw-rw-r-- 1 azureuser azureuser  423325 Jun 10 12:53 0005.jpg
-rw-rw-r-- 1 azureuser azureuser 2278001 Jun 12 04:21 0006.jpg
-rw-rw-r-- 1 azureuser azureuser 1220517 Jun 13 14:44 0007.jpg
drwxrwxr-x 2 azureuser azureuser    4096 Jun 13 20:16 gifs

Cada linha fornece informações detalhadas sobre o ficheiro ou o diretório correspondente. Estas informações incluem as permissões atribuídas ao mesmo, o seu proprietário, o respetivo tamanho em bytes, a última vez que foi modificado e o nome do ficheiro ou do diretório.

Comando cat

Suponha que pretende ver o que está num ficheiro. Pode utilizar o comando cat para o fazer. A saída não fará muito sentido, a menos que se trate de um ficheiro de texto. O seguinte comando apresenta o conteúdo do ficheiro os-release armazenado no diretório /etc:

cat /etc/os-release

Este comando é útil porque lhe indica que distribuição Linux está a executar:

NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

O diretório /etc é especial no Linux. Contém ficheiros de configuração do sistema. Não deve eliminar ficheiros deste diretório, a não ser que saiba o que está a fazer.

Comando sudo

Alguns comandos Bash só podem ser executados pelo usuário root; um administrador de sistema ou superusuário. Se tentar executar um destes comandos sem privilégios suficientes, não será bem-sucedido. Por exemplo, apenas os utilizadores com sessão iniciada como superutilizador podem utilizar cat para apresentar o conteúdo de /etc/at.n.neg:

cat /etc/at.deny

O ficheiro at.deny é especial, uma vez que determina quem pode utilizar outros comandos do Bash para submeter tarefas para execução posterior.

Você não quer correr como root na maioria das vezes; É demasiado perigoso. Para executar comandos que requerem privilégio de administrador sem iniciar sessão como superutilizador, irá prefaciar os comandos com sudo:

sudo cat /etc/at.deny

sudo significa "superusuário fazer". Ao usá-lo, você está dizendo ao shell que, para este comando, você está agindo com o nível de permissão de usuário raiz.

Comandos cd mkdir e rmdir

O comando cd significa "mudar de diretório" e faz exatamente o que o nome sugere: mudar do diretório atual para outro diretório. Permite-lhe passar de um diretório para outro tal como o comando equivalente no Windows. O seguinte comando permite passar para um subdiretório do diretório atual denominado orders (encomendas):

cd orders

Pode subir um diretório ao especificar .. como o nome do diretório:

cd ..

Este comando muda para o seu diretório pessoal; Aquele em que aterrou quando iniciou sessão pela primeira vez:

cd ~

Pode criar diretórios ao utilizar o comando mkdir. O seguinte comando cria um subdiretório com o nome orders (encomendas) no diretório de trabalho atual:

mkdir orders

Se quiser criar um subdiretório e outro subdiretório no mesmo com um comando, utilize o sinalizador --parents:

mkdir --parents orders/2019

O rmdir comando exclui (remove) um diretório, mas somente se ele estiver vazio. Se não estiver vazio, receberá um aviso. Felizmente, você pode usar o rm comando para excluir diretórios que não estão vazios em combinação com o -r sinalizador (recursivo). O comando ficaria assim, rm -r.

Comando rm

O rm comando é curto para "remover". Como seria de esperar, rm elimina ficheiros. Assim, este seguinte comando remove o ficheiro 0001.jpg:

rm 0001.jpg

Além disso, este comando elimina todos os ficheiros do diretório atual:

rm *

Tenha cuidado com rm. É um comando perigoso.

Executar rm com o sinalizador -i permite-lhe pensar antes de eliminar:

rm -i *

Faça com que seja um hábito incluir -i em todos os comandos rm para evitar ser vítima de um dos maiores erros do Linux. O temido comando rm -rf / elimina todos os ficheiros de uma unidade inteira. Funciona ao eliminar de forma recursiva todos os subdiretórios da raiz e os respetivos subdiretórios. O sinalizador -f (correspondente a "forçar") torna o comando ainda mais perigoso ao suprimir avisos. Não o utilize.

Se quiser eliminar um subdiretório denominado orders (encomendas) que não esteja vazio, pode utilizar o comando rm da seguinte forma:

rm -r orders

Desta forma, elimina o subdiretório orders (encomendas) e tudo o que este contiver, incluindo outros subdiretórios.

Comando cp

O comando cp copia não só ficheiros, mas também diretórios inteiros (e subdiretórios), se assim quiser. Para fazer uma cópia do ficheiro 0001.jpg com o nome 0002.jpg, utilize este comando:

cp 0001.jpg 0002.jpg

Se o ficheiro 0002.jpg já existir, o Bash irá substituí-lo automaticamente. Isto é útil se for o que pretende, mas não tão útil se não se aperceber de que está prestes a substituir a versão antiga.

Felizmente, se utilizar o sinalizador -i (correspondente a "interativo"), o Bash irá avisá-lo antes de eliminar os ficheiros existentes. Isto é mais seguro:

cp -i 0001.jpg 0002.jpg

Você pode usar curingas para copiar vários arquivos de uma só vez. Para copiar todos os ficheiros no diretório atual para um subdiretório com o nome photos (fotografias), faça o seguinte:

cp * photos

Para copiar todos os ficheiros num subdiretório com o nome photos (fotografias) para um subdiretório com o nome images (imagens), faça o seguinte:

cp photos/* images

Desta forma, pressupõe-se que o diretório images (imagens) já existe. Se não existir, pode criá-lo e copiar o conteúdo do diretório photos (fotografias) ao utilizar o seguinte comando:

cp -r photos images

O -r significa "recursivo". Um benefício adicional do sinalizador é que, se as -r fotos contiverem subdiretórios próprios, elas também serão copiadas para o diretório de imagens.

Comando ps

O comando ps fornece-lhe um instantâneo de todos os processos atualmente executados. Por si só, sem argumentos, ele mostra todos os seus processos shell; por outras palavras, não muito. No entanto, o cenário muda de figura ao incluir o sinalizador -e:

ps -e

O sinalizador -e apresenta todos os processos em execução, e normalmente há vários.

Para obter uma perspetiva mais abrangente dos processos que estão a ser executados no sistema, utilize o sinalizador -ef:

ps -ef 

Este sinalizador apresenta os nomes de todos os processos em execução, os respetivos números de identificação de processo (PIDs), os PIDs subordinados destes (PPIDs) e quando foram iniciados (STIME). Também apresenta o terminal a que estão ligados (TTY), se aplicável, quanto tempo de CPU acumularam (TIME) e os respetivos nomes de caminho completos. Aqui está um exemplo abreviado:

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 13:35 ?        00:00:03 /sbin/init
root          2      0  0 13:35 ?        00:00:00 [kthreadd]
root          3      2  0 13:35 ?        00:00:00 [rcu_gp]
root          4      2  0 13:35 ?        00:00:00 [rcu_par_gp]
root          5      2  0 13:35 ?        00:00:00 [kworker/0:0-cgr]
root          6      2  0 13:35 ?        00:00:00 [kworker/0:0H-kb]
root          8      2  0 13:35 ?        00:00:00 [mm_percpu_wq]
root          9      2  0 13:35 ?        00:00:01 [ksoftirqd/0]
root         10      2  0 13:35 ?        00:00:02 [rcu_sched]

Como nota, poderá encontrar documentação que apresenta o comando ps a ser utilizado da seguinte forma:

ps aux

Os argumentos ps aux e ps -ef têm a mesma função. Esta dualidade remonta às diferenças históricas entre os sistemas POSIX Unix (sendo o Linux um deles) e os sistemas BSD Unix (o mais comum dos quais é o macOS). No início, o POSIX utilizou o sinalizador -ef, enquanto o BSD exigia aux. Atualmente, ambas as famílias de sistemas operativos aceitam os dois formatos.

Esta é uma excelente oportunidade para lhe relembrar porque deve consultar atentamente o manual para obter todos os comandos do Linux. Aprender a utilizar Bash é como aprender inglês como segunda língua. Existem muitas exceções à regra.

Comando w

Os utilizadores vão e vêm, e por vezes há utilizadores que não quer mesmo manter. Quando um funcionário sai para buscar outras oportunidades, o administrador do sistema é chamado para garantir que o trabalhador não possa mais entrar nos sistemas de computador da empresa. Espera-se também que os administradores de sistemas saibam quem está conectado e quem não deve estar.

Para descobrir quem está nos seus servidores, o Linux fornece o comando w (correspondente a "quem"). Apresenta informações sobre os utilizadores atualmente no sistema informático e sobre as atividades desses utilizadores. O comando w apresenta os nomes dos utilizadores, os seus endereços IP, quando iniciaram sessão, que processos estão atualmente a executar e quanto tempo é que esses processos estão a consumir. É uma ferramenta útil para os administradores de sistema.

Operadores de E/S do Bash

Pode fazer várias coisas no Linux simplesmente ao executar comandos do Bash e as suas múltiplas opções. No entanto, pode fazer mais ainda ao combinar comandos com operadores de E/S:

  • O operador < é utilizado para redirecionar a entrada para uma origem que não seja o teclado
  • O operador > é utilizado para redirecionar a saída para um destino que não seja o ecrã
  • O operador >> é utilizado para fazer o mesmo, embora acrescente em vez de substituir
  • O operador | é utilizado para encaminhar a saída de um comando para a entrada de outro comando

Suponha que pretende apresentar tudo o que se encontra no diretório atual, mas capturar a saída num ficheiro com o nome listing.txt. O seguinte comando faz isso mesmo:

ls > listing.txt

Se o ficheiro listing.txt já existir, será substituído. Se, em alternativa, utilizar o operador >>, a saída do comando ls será acrescentada ao que já existe no ficheiro listing.txt:

ls >> listing.txt

O operador de tubulação é poderoso (e frequentemente usado). Redireciona a saída do primeiro comando para a entrada do segundo comando. Suponhamos que utiliza o comando cat para apresentar o conteúdo de um ficheiro grande, mas que esse conteúdo é percorrido demasiado rapidamente para que possa lê-lo. Pode tornar a saída mais gerível ao encaminhar os resultados para outro comando, como more. O seguinte comando apresenta todos os processos atualmente executados. No entanto, quando o ecrã estiver cheio, a saída é colocada em pausa até selecionar Enter para apresentar a próxima linha:

ps -ef | more

Também pode encaminhar a saída para o comando head e ver apenas as primeiras linhas:

ps -ef | head

Ou suponha que você queira filtrar a saída para incluir apenas as linhas que contêm a palavra "daemon". Uma maneira de fazer isso é canalizando a saída para a ferramenta útil grep do ps Linux:

ps -ef | grep daemon

A saída poderá ter o seguinte aspeto:

azureus+  52463  50702  0 23:28 pts/0    00:00:00 grep --color=auto deamon
azureuser@bash-vm:~$ ps -ef | grep daemon
root        449      1  0 13:35 ?        00:00:17 /usr/lib/linux-tools/4.18.0-1018-azure/hv_kvp_daemon -n
root        988      1  0 13:35 ?        00:00:00 /usr/lib/accountsservice/accounts-daemon
message+   1002      1  0 13:35 ?        00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon     1035      1  0 13:35 ?        00:00:00 /usr/sbin/atd -f
root       1037      1  0 13:35 ?        00:00:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
root       1039      1  0 13:35 ?        00:00:00 /usr/lib/linux-tools/4.18.0-1018-azure/hv_vss_daemon -n
azureus+  52477  50702  0 23:28 pts/0    00:00:00 grep --color=auto daemon

Também pode utilizar ficheiros como entrada. Por predefinição, a entrada padrão provém do teclado, mas também pode ser redirecionada. Para obter a entrada de um ficheiro em vez do teclado, utilize o operador <. Uma tarefa comum do administrador de sistema é ordenar o conteúdo de um ficheiro. Como o nome sugere, o comando sort apresenta texto por ordem alfabética:

sort < file.txt

Para guardar os resultados ordenados num novo ficheiro, pode redirecionar a entrada e a saída:

sort < file.txt > sorted_file.txt

Pode utilizar os operadores de E/S para encadear comandos do Linux, conforme necessário. Considere o seguinte comando:

cat file.txt | fmt | pr | lpr

A saída de cat é encaminhada para fmt, a saída de fmt é encaminhada para pr e assim sucessivamente. O comando fmt formata e organiza os resultados num parágrafo. O comando pr pagina os resultados. Por fim, o comando lpr envia a saída paginada para a impressora. Tudo numa única linha!