Comandos e operadores do Bash
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!