Comandos e operadores Bash
Cada linguagem de shell tem seus comandos mais usados. Vamos começar criando seu repertório Bash examinando os comandos mais usados.
Comandos Bash
Vamos examinar os comandos Bash comuns e como usá-los.
Comando ls
ls
lista o conteúdo do seu diretório atual ou o diretório especificado em um argumento para o comando. Por si só, ele lista os arquivos e diretórios no diretório atual:
ls
Os arquivos e diretórios cujos nomes começam com um ponto ficam ocultos por padrão. Para incluir esses itens em uma listagem de diretório, use um sinalizador de -a
:
ls -a
Para obter ainda mais informações sobre os arquivos e diretórios no diretório atual, use um sinalizador de -l
:
ls -l
Aqui estão alguns exemplos de saída de um diretório que contém alguns JPEGs e PNGs e um subdiretório chamado 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 arquivo ou diretório correspondente. Essas informações incluem as permissões atribuídas a ela, seu proprietário, seu tamanho em bytes, a última vez que ela foi modificada e o nome do arquivo ou diretório.
Comando cat
Suponha que você queira ver o que está dentro de um arquivo. Você pode usar o comando cat
para isso. A saída não fará muito sentido, a menos que o arquivo seja um arquivo de texto. O comando a seguir mostra o conteúdo do arquivo os-release armazenado no diretório /etc:
cat /etc/os-release
Esse é um comando útil porque informa qual distribuição do Linux você está executando:
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. Ele contém arquivos de configuração do sistema. Você não deseja excluir nenhum arquivo desse diretório, a menos que saiba o que está fazendo.
Comando sudo
Alguns comandos Bash só podem ser executados pelo usuário raiz — um administrador do sistema ou um superusuário. Se você tentar um desses comandos sem privilégios suficientes, ele falhará. Por exemplo, somente os usuários conectados como um superusuário podem usar cat
para exibir o conteúdo de /etc/at.deny:
cat /etc/at.deny
at.deny é um arquivo especial que determina quem pode usar outros comandos Bash para enviar trabalhos para execução posterior.
Na maioria das vezes, você não quer executar como raiz, pois é muito perigoso. Para executar comandos que exigem privilégios de administrador sem fazer logon como superusuário, utilize o sufixo sudo
nos comandos:
sudo cat /etc/at.deny
sudo
quer dizer "o superusuário faz". Ao usá-lo, estará informando ao shell que, para esse único comando, você está agindo com o nível de permissão do usuário raiz.
Comandos cd
, mkdir
e rmdir
cd
significa "change directory (alterar diretório, em inglês) e faz exatamente o que o nome sugere: ele altera o diretório atual para outro diretório. Permite que você mova de um diretório para outro assim como seu equivalente no Windows. O comando a seguir muda para um subdiretório do diretório atual chamado orders:
cd orders
Você pode mover um diretório para cima especificando ..
como o nome do diretório:
cd ..
Esse comando muda para o diretório base, que é aquele em que você chega ao se conectar pela primeira vez:
cd ~
Você pode criar diretórios usando o comando mkdir
. O comando a seguir cria um subdiretório chamado orders no diretório de trabalho atual:
mkdir orders
Se você quiser criar um subdiretório e outro subdiretório sob ele com um comando, use o sinalizador --parents
:
mkdir --parents orders/2019
O comando rmdir
excluirá (removerá) um diretório, mas somente se ele estiver vazio. Se não estiver vazio, você receberá um aviso. Felizmente, você pode usar o comando rm
para excluir diretórios que não estejam vazios em combinação com o sinalizador -r
(recursivo). O comando, então, teria a aparência a seguir: rm -r
.
Comando rm
O comando rm
é a abreviação de "remover". Como você esperaria, rm
exclui arquivos. Portanto, esse comando coloca um fim ao 0001.jpg:
rm 0001.jpg
Esse comando excluir todos os arquivos no diretório atual:
rm *
Tenha cuidado com o rm
. É um comando perigoso.
A execução de rm
com um sinalizador de -i
permite que você pense antes de excluir:
rm -i *
Torne-o um hábito incluir -i
em cada comando rm
, e você pode evitar ser vítima de um dos maiores problemas do Linux. O temido comando rm -rf /
exclui todos os arquivos em uma unidade inteira. Ele funciona pela exclusão recursiva de todos os subdiretórios da raiz e de seus subdiretórios. O sinalizador -f
(de "forçar") aumenta o problema suprimindo prompts. Não faça isso.
Se você quiser excluir um subdiretório chamado orders que não esteja vazio, poderá usar o comando rm
desta maneira:
rm -r orders
Isso exclui o subdiretório orders e tudo que ele contém, inclusive outros subdiretórios.
Comando cp
O comando cp
copia não apenas arquivos, mas diretórios inteiros (e subdiretórios), se você desejar. Para fazer uma cópia de 0001.jpg chamado 0002.jpg, use este comando:
cp 0001.jpg 0002.jpg
Se 0002.jpg já existir, o Bash o substituirá silenciosamente. Isso é ótimo se é o que você pretendia, mas não tão maravilhoso se você não percebeu que estava prestes a substituir a versão antiga.
Felizmente, se você usa o sinalizador -i
(de "interativo"), o Bash o avisa antes de excluir os arquivos existentes. Isso é mais seguro:
cp -i 0001.jpg 0002.jpg
Você pode usar curingas para copiar vários arquivos de uma vez. Para copiar todos os arquivos no diretório atual para um subdiretório chamado photos, faça o seguinte:
cp * photos
Para copiar todos os arquivos em um subdiretório chamado photos para um subdiretório chamado images, faça o seguinte:
cp photos/* images
Isso pressupõe que o diretório images já exista. Se não existir, você poderá criá-lo e copiar o conteúdo do diretório photos usando este comando:
cp -r photos images
-r
quer dizer "recursivo". Um benefício adicional do sinalizador -r
é que, se photos contiver subdiretórios próprios, eles também serão copiados para o diretório images.
Comando ps
O comando ps
fornece um instantâneo de todos os processos em execução no momento. Por si só, sem argumentos, ele mostra todos os processos do shell, ou seja, não muito. Mas é uma história diferente quando você inclui um sinalizador de -e
:
ps -e
O -e
lista todos os processos em execução, e geralmente há muitos deles.
Para obter uma visão mais abrangente de quais processos estão sendo executados no sistema, use o sinalizador -ef
:
ps -ef
Esse sinalizador mostra os nomes de todos os processos em execução, seus PIDs (números de identificação de processo), os PPIDs (PIDs de seus pais) e quando eles começaram (STIME). Ele também mostra qual terminal, se houver, ao qual estão anexados (TTY), quanto tempo de CPU ele colocou em rack (TIME) e seus nomes de caminho completo. Veja 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]
Além disso, você pode encontrar a documentação que mostra ps
sendo usado dessa maneira:
ps aux
ps aux
e ps -ef
são iguais. Essa dualidade é voltada para as diferenças históricas entre os sistemas Unix POSIX (entre eles, o Linux) e os sistemas Unix BSD (o mais comum deles é o macOS). No início, o POSIX usava -ef
enquanto o BSD exigia aux
. Atualmente, ambas as famílias de sistemas operacionais aceitam qualquer um dos formatos.
Isso serve como um lembrete excelente de por que você deve examinar de maneira mais detalhada o manual em busca de todos os comandos do Linux. Aprender Bash é como aprender inglês como uma segunda língua. Há muitas exceções às regras.
Comando w
Usuários vem, usuários vão e, às vezes, você obtém usuários que não deseja. Quando um funcionário sai em busca de outras oportunidades, o administrador do sistema é chamado para garantir que ele não possa mais fazer se conectar aos sistemas de computador da empresa. Os administradores do sistema também devem saber quem está conectado — e quem não deveria estar.
Para descobrir quem está nos servidores, o Linux fornece o comando w
(de "who", "quem", em inglês). Ele exibe informações sobre os usuários que estão no sistema de computador no momento e as atividades desses usuários. w
mostra os nomes de usuário, seus endereços IP, quando eles fizeram logon, quais processos estão sendo executados no momento e quanto tempo esses processos estão consumindo. É uma ferramenta valiosa para administradores do sistema.
Operadores de E/S de Bash
Você pode fazer muito no Linux experimentando comandos Bash e suas muitas opções. Porém, você pode realmente ser produtivo ao combinar comandos usando operadores de E/S:
<
para redirecionar a entrada para uma fonte que não o teclado>
para redirecionar a saída para um destino que não a tela>>
para fazer o mesmo, mas acrescentando, em vez de substituindo|
para canalizar a saída de um comando para a entrada de outro
Suponha que você queira listar tudo no diretório atual, mas capture a saída em um arquivo chamado listing.txt. O comando a seguir faz exatamente isso:
ls > listing.txt
Se listing.txt já existir, ele será substituído. Se você usar o operador de >>
em vez disso, a saída de ls
será anexada ao que já está em listing.txt:
ls >> listing.txt
O operador de tubulação é poderoso (e frequentemente utilizado). Ele redireciona a saída do primeiro comando para a entrada do segundo. Digamos que você use cat
para exibir o conteúdo de um arquivo grande, mas o conteúdo role rápido demais para você ler. Você pode tornar a saída mais gerenciável ao canalizar os resultados para outro comando, como more
. O comando a seguir lista todos os processos em execução no momento. Porém, quando a tela estiver cheia, a saída fará uma pausa até que você selecione Enter para mostrar a próxima linha:
ps -ef | more
Você também pode canalizar a saída para head
para ver apenas as primeiras várias 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 é canalização da saída de ps
para a ferramenta grep
útil do Linux:
ps -ef | grep daemon
A saída pode ter a seguinte aparência:
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
Você também pode usar arquivos como entrada. Por padrão, a entrada padrão vem do teclado, mas também pode ser redirecionada. Para obter a entrada de um arquivo em vez do teclado, use o operador <
. Uma tarefa de sysadmin comum é classificar o conteúdo de um arquivo. Como o nome sugere, sort
classifica o texto em ordem alfabética:
sort < file.txt
Para salvar os resultados classificados em um novo arquivo, você pode redirecionar a entrada e a saída:
sort < file.txt > sorted_file.txt
Você pode usar os operadores de E/S para encadear comandos do Linux, conforme necessário. Considere o seguinte código:
cat file.txt | fmt | pr | lpr
A saída de cat
vai para fmt
, a saída de fmt
vai para pr
e assim por diante. fmt
formata os resultados em um parágrafo organizado. pr
pagina os resultados. E lpr
envia a saída paginada para a impressora. Tudo em uma única linha.