Início·Comandos de terminal

Referência de comandos de terminal

227 comandos com as opções que se usam de verdade e um exemplo de cada

⌨️ Comandos e opções são digitados como estão, então não se traduzem: só as explicações mudam de idioma.

Arquivos e diretórios32

Mover, apagar e encontrar. Alguns não perguntam duas vezes, e é por isso que -i vira hábito.

lsLista o conteúdo de um diretório; nomes que começam com ponto só aparecem com -a.cdMuda o diretório atual do shell; como é um comando interno, um cd dentro de um script ou subshell não move o seu shell de fora.pwdMostra o diretório atual; se você entrou por um link simbólico, ele exibe o caminho do link, e só -P dá o real.mkdirCria um diretório; sem -p ele falha tanto quando falta o diretório pai quanto quando ele já existe.rmdirApaga um diretório apenas se estiver vazio; qualquer coisa dentro faz ele recusar, e daí o uso de rm -r.rmApaga arquivos de vez: não existe lixeira, e um espaço a mais em rm -rf destrói o que você não quis.cpCopia arquivos ou árvores inteiras; se o destino já existe, a origem entra dentro dele; se não, ela passa a ter esse nome.mvRenomeia ou move; sem -i ou -n sobrescreve o destino sem avisar.touchAtualiza as datas do arquivo e o cria vazio se não existir; nunca mexe no conteúdo.catImprime arquivos um após o outro; joga tudo de uma vez, então arquivo longo pede less e cat file | grep tem um pipe sobrando.lessPercorre o arquivo em telas sem carregá-lo todo; / busca e q sai, e diferente do more ele não fecha sozinho no fim.headMostra o começo de um arquivo; com vários arquivos ele intercala um cabeçalho para cada, a não ser com -q.tailMostra o fim de um arquivo e continua acompanhando com -f; só -F reabre o arquivo depois de uma rotação de log.findPercorre a árvore testando cada entrada; ponha o padrão entre aspas como -name '*.log', senão o shell o expande antes de find ver.locateConsulta um índice pronto em vez do disco: responde na hora, mas não vê arquivos criados depois do último updatedb.treeDesenha a estrutura de diretórios como uma árvore indentada; não vem instalado por padrão no macOS nem em imagens Linux enxutas.duSoma o espaço em disco que os arquivos realmente ocupam; conta blocos alocados, então o total difere da soma dos tamanhos e do df.dfMostra espaço usado e livre por sistema de arquivos; um disco pode ficar sem inodes mesmo com bytes sobrando, e só df -i revela isso.lnDá outro nome a um arquivo; um link simbólico com -s pode apontar para qualquer lugar, mas quebra se o alvo se mover, e um caminho relativo é lido a partir do diretório do link.statMostra o registro do inode: tamanho, permissões, dono e as três datas; o formato é -c no GNU e -f no BSD, sendo que no GNU -f quer dizer outra coisa.fileDescobre o tipo do arquivo pelo conteúdo, não pelo nome; ignora a extensão, e é assim que um .jpg que é PDF aparece.basenameRemove a parte do diretório de um caminho e pode cortar um sufixo; é só manipulação de texto e nunca verifica se o arquivo existe.dirnameMantém só a parte do diretório; sem barra alguma a resposta é um ponto, e como basename ele só mexe em texto.realpathTransforma qualquer caminho em um caminho absoluto com links e pontos resolvidos; a versão do macOS é a do BSD, então faltam opções GNU como --relative-to.rsyncCopia só as diferenças entre duas árvores, local ou por ssh; a barra final na origem significa o conteúdo dela, e sem ela o diretório entra um nível mais fundo.mountLiga um sistema de arquivos a um diretório; o que já estava no ponto de montagem fica escondido, não apagado, e volta ao desmontar.umountDesmonta um sistema de arquivos; o nome não tem n, e ele recusa com device is busy enquanto algum processo mantiver um arquivo aberto ou seu diretório atual lá dentro.readlinkMostra para onde um link simbólico aponta, um salto só a menos que use -f; em um arquivo que não é link, não imprime nada e sai com erro.mktempCria um arquivo ou diretório temporário com nome imprevisível e mostra o caminho; ele não se limpa sozinho, então use um trap na saída.sha256sumMostra a impressão SHA-256 do arquivo para conferir se o download veio inteiro; hash igual prova que os bytes são iguais, não que a origem é confiável.truncateDefine o tamanho exato do arquivo: ao crescer, só cria um buraco esparso sem reservar espaço, e ao encurtar descarta o final sem aviso.shredSobrescreve os bytes antes de apagar, mas em SSD e em sistemas copy-on-write como btrfs ou APFS os blocos antigos podem sobrar, então a resposta real é criptografar o disco.

Processamento de texto32

Foram feitos para serem encadeados com pipes. Três comandos ligados costumam ser mais curtos que um que faça tudo.

grepSeleciona as linhas que casam com um padrão; por padrão usa regex básica, então + ? | e () precisam de -E ou de barra invertida.sedEdita texto linha a linha, quase sempre com s/old/new/; o -i no lugar difere entre GNU e BSD, e sem o g final só a primeira ocorrência de cada linha muda.awkDivide cada linha em campos e roda um pequeno programa; $0 é a linha inteira e $1 o primeiro campo, e o separador padrão é qualquer sequência de espaços, não um só.sortOrdena linhas; sem -n compara como texto, então 10 vem antes de 9, e o locale decide a ordem a menos que você use LC_ALL=C na frente.uniqJunta só linhas iguais que estão lado a lado, não duplicatas espalhadas pelo arquivo, por isso quase sempre vem depois do sort.wcConta linhas, palavras e bytes; -l conta caracteres de nova linha, então uma última linha sem quebra não entra na conta.cutRecorta campos fixos ou posições de caractere; o delimitador é um único caractere e repetições não são unidas, então colunas alinhadas por espaços são tarefa do awk.pasteCola arquivos lado a lado com uma tabulação entre eles; diferente do join, ele casa por posição e nunca olha o conteúdo.trTroca ou apaga caracteres um a um; lê apenas a entrada padrão, então passar um nome de arquivo falha e é preciso redirecionar com < ou usar pipe.joinUne dois arquivos por um campo comum, como um join de banco; os dois precisam estar ordenados por esse campo, senão linhas caem silenciosamente.commCompara dois arquivos ordenados e mostra três colunas: só do primeiro, só do segundo e de ambos; entrada fora de ordem dá resultado sem sentido, e as opções escondem colunas em vez de escolhê-las.diffMostra o que mudou entre dois arquivos; o formato unificado -u é o que patch e a revisão de código esperam, e ele sai com 1 quando diferem, o que trava um script com set -e.patchAplica um diff nos arquivos; -p decide quantos componentes do caminho descartar, e um diff do git precisa de -p1 por causa dos prefixos a/ e b/.teeCopia a entrada para um arquivo e para a tela ao mesmo tempo; é assim que se escreve em arquivo do root, porque em sudo cmd > file o redirecionamento é aberto pelo seu shell.xargsTransforma linhas de entrada em argumentos de outro comando; nomes com espaços quebram tudo, a não ser que os dois lados usem NUL, ou seja find -print0 com xargs -0.echoImprime seus argumentos e uma quebra de linha; -e e o tratamento de barras invertidas variam entre shells, então printf é a escolha portável.printfFormata texto com um modelo igual ao printf de C; não acrescenta quebra de linha e repete o modelo enquanto sobrarem argumentos.jqFiltra e remodela JSON com sua própria linguagem pequena; muitas vezes não vem instalado, e é o -r que tira as aspas das strings.columnPreenche os campos para alinhar as colunas como uma tabela; separadores repetidos contam como um, então um CSV com células vazias sai deslocado.foldQuebra linhas longas em uma largura fixa inserindo quebras reais; sem -s corta palavras no meio e, diferente da quebra visual do terminal, muda o conteúdo.nlNumera as linhas ao imprimir; por padrão pula as vazias, e é por isso que os números divergem do editor até você usar -b a.revInverte os caracteres de cada linha, não a ordem das linhas — isso é tarefa do tac.splitCorta um arquivo em pedaços; a linha de cabeçalho fica só no primeiro, e os nomes terminam em aa, ab a menos que use -d para numerar.csplitCorta o arquivo onde um padrão aparece, não em tamanho fixo; os números impressos são bytes, e {*} quer dizer repita quantas vezes casar.expandConverte tabulações em espaços; um Makefile precisa de tabs reais, então rodar expand nele quebra o build.shufDevolve as linhas em ordem aleatória; é do GNU coreutils e não existe no macOS, onde o substituto sort -R agrupa linhas iguais.tacImprime as linhas do arquivo da última para a primeira; é do GNU coreutils, no macOS use tail -r, e não confunda com rev, que inverte caracteres.stringsExtrai texto imprimível de um binário; pega tudo que parece texto, então a maior parte do resultado é coincidência, não sentido.iconvConverte texto de uma codificação para outra; para no primeiro byte que não consegue mapear, a menos que use -c, e não adivinha a codificação de entrada.vimUm editor modal: digitar não faz nada até você apertar i, e você sai com Esc e depois :wq para salvar ou :q! para descartar.nanoUm editor simples de tela cheia com os comandos escritos embaixo; o acento circunflexo em ^O e ^X significa Ctrl, não um caractere literal.base64Converte bytes em texto ASCII e de volta para que binário passe por canais só de texto; é codificação, não criptografia, e decodificar é -d no GNU mas -D no macOS antigo.

git45

O confuso é que desfazer tem várias formas: mover para onde um branch aponta não é o mesmo que criar um commit que reverte.

git initTransforma uma pasta em um repositório git novo; init sozinho não rastreia nada, ainda faltam add e commit.git cloneCopia um repositório remoto com o histórico; um clone --depth 1 não traz commits antigos nem outros branches, e depois exige --unshallow.git configLê e escreve as configurações do git; sem --global vale só para este repositório, por isso um clone novo não sabe dela.git init --bareCria um repositório sem árvore de trabalho, feito só para receber push; não dá para editar arquivos nele, mas nenhum push é recusado por causa do branch ativo.git addPrepara o arquivo como ele está naquele instante; se você editar depois do add, essa mudança fica de fora e precisa de outro add.git commitRegistra o que está preparado como um commit; -a pega só arquivos já rastreados, então os novos ficam de fora.git statusMostra o que está preparado, alterado ou sem rastreio; arquivos novos aparecem agrupados por pasta a menos que use -uall.git diffMostra só as mudanças que ainda não foram preparadas; é por isso que parece vazio logo após git add — use --staged.git logLista o histórico do mais novo ao mais antigo, mas só os ancestrais do HEAD atual: outros branches exigem --all.git showImprime um commit com mensagem e diff; a forma <commit>:<caminho> tira uma versão antiga do arquivo sem mexer na sua cópia de trabalho.git blameMarca cada linha com o commit que a alterou por último; uma reformatação esconde o autor real, e é para isso que servem -w e --ignore-rev.git branchLista, cria e apaga branches localmente; apagar um não mexe no remoto, o servidor ainda pede git push origin --delete.git checkoutO comando antigo que troca de branch e restaura arquivos, dividido em switch e restore no git 2.23; checkout -- <arquivo> apaga de vez as edições não commitadas.git switchO comando do git 2.23 que apenas troca de branch; nunca reescreve o conteúdo dos arquivos, isso é papel do restore.git restoreO comando do git 2.23 para devolver o conteúdo de um arquivo; por padrão sobrescreve o arquivo e as edições não commitadas somem, enquanto --staged só tira da área de preparação.git mergeTraz o trabalho de outro branch para o atual; --squash não registra uma mesclagem, então o git continua vendo aquele branch como não mesclado.git rebaseReaplica seus commits sobre outra base; os hashes mudam, então nunca faça rebase de um branch que outras pessoas já baixaram — ali se usa merge.git resetMove o ponteiro do branch para outro commit: --soft mantém tudo preparado, --mixed (padrão) também limpa a área de preparação mas deixa suas edições nos arquivos, e --hard descarta essas edições junto, sem volta.git revertDesfaz um commit acrescentando outro commit contrário; não apaga o histórico, ao contrário do reset que move o ponteiro, então o que já foi enviado se desfaz com revert.git cherry-pickCopia um único commit para o branch atual como um commit novo com outro hash, então mesclar aquele branch depois pode mostrar a mesma mudança duas vezes.git stashGuarda as mudanças inacabadas e devolve a árvore limpa; arquivos sem rastreio ficam para trás a menos que use -u, e pop apaga a entrada enquanto apply a mantém.git cleanApaga arquivos sem rastreio, dos quais o git nunca teve cópia, então nada volta; -fdx também remove ignorados como um .env local, rode -n antes.git remoteGerencia os nomes e as URLs dos repositórios remotos; só anota, nada trafega até você fazer fetch ou push.git fetchBaixa os commits novos sem tocar nos seus arquivos nem no seu branch, então ainda falta um merge ou rebase, e branches apagados no servidor continuam listados até --prune.git pullExecuta fetch e merge de uma vez, e daí vêm os commits de mesclagem inesperados; --rebase ou --ff-only evita isso.git pushEnvia seus commits para um remoto; --force sobrescreve o branch remoto e pode apagar commits de outras pessoas, então use --force-with-lease, que recusa se o remoto andou.git tagColoca um nome, como uma versão, em um commit; um git push comum não leva as tags, é preciso enviar a tag pelo nome.git rmRemove um arquivo do índice e do disco; --cached mantém o arquivo e só para de rastreá-lo, mas o conteúdo antigo fica no histórico, então um segredo vazado continua lá.git mvMove um arquivo e prepara a mudança de uma vez; o git não guarda renomeações, ele as deduz pelo conteúdo parecido, e uma troca só de maiúsculas precisa de -f no macOS e no Windows.git ls-filesLista caminhos do índice, não do disco, e é por isso a lista confiável para scripts; -i não funciona sozinho e exige -c ou -o mais --exclude-standard.git update-indexAltera o índice diretamente; as marcas são locais e nunca vão no push, e a que preserva suas edições locais em um arquivo de configuração é --skip-worktree, não --assume-unchanged.git sparse-checkoutAdicionado no git 2.25, mantém em disco só os diretórios que você nomeia; o histórico continua completo e o modo cone aceita nomes de diretório, não padrões glob.git reflogGuarda todas as posições que HEAD e seus branches tiveram, e é ali que reaparecem commits perdidos por reset --hard ou por um branch apagado; as entradas expiram em 90 dias e só existem na sua máquina.git bisectDivide o intervalo de commits ao meio para achar o primeiro com defeito; termine com git bisect reset, senão você fica parado em um commit solto.git describeNomeia o commit atual a partir da tag mais próxima, como v1.2.0-5-gabc1234; por padrão só vê tags anotadas, então as leves pedem --tags e um repositório sem tag pede --always.git rev-parseConverte um nome como HEAD ou v1.2.0^ em um hash real e diz onde está o repositório; scripts pegam o nome do branch com --abbrev-ref HEAD, e fora de um repositório ele termina com erro.git fsckVerifica o banco de objetos e lista commits que nada aponta, o segundo jeito de achar trabalho perdido depois de um reset quando o reflog já expirou; ele relata, não conserta.git gcEmpacota objetos soltos e descarta os inalcançáveis para encolher o .git; --prune=now também joga fora os commits que o reflog segurava, tirando a rede de segurança para desfazer um reset.git archiveExporta os arquivos de um commit como tar ou zip; deixa de fora o .git e os arquivos sem rastreio, o que rende um pacote de release mais limpo que zipar a pasta.git applyAplica um arquivo diff na sua árvore de trabalho; não cria commit nem lê o autor do patch, então patches recebidos por e-mail são caso para o am.git amTransforma patches de e-mail em commits mantendo autor e mensagem originais; se falhar, para no meio da série, e você precisa concluir com --continue, --skip ou --abort.git format-patchEscreve um arquivo .patch em formato de e-mail por commit; format-patch main quer dizer os commits depois de main, não o próprio main.git shortlogAgrupa os commits por autor e conta, útil para notas de versão; uma pessoa com dois e-mails conta duas vezes a menos que um .mailmap os una.git worktreeCria uma segunda pasta de trabalho do mesmo repositório para tocar dois branches ao mesmo tempo sem clonar de novo; o mesmo branch não pode estar em duas, e apagar a pasta na mão deixa um registro até o prune.git submoduleFixa outro repositório em um commit dentro do seu; um clone comum deixa a pasta vazia até update --init, e o pai aponta para um commit, não para um branch.

Processos e sistema36

O que está rodando e o que está comendo a máquina. Identificar vem antes de matar.

psTira uma foto instantanea dos processos em execucao; `ps aux` e a forma BSD sem hifen e `ps -ef` a POSIX, e misturar as duas e o erro mais comum.topRedesenha a lista de processos a cada poucos segundos; as opcoes mudam completamente entre plataformas: uma amostra unica e `-b -n 1` no Linux e `-l 1` no macOS.htopUma reescrita de top com cor e mouse onde F9 envia um sinal direto, mas nao vem instalado: primeiro `apt install htop` ou `brew install htop`.killEnvia um sinal a um PID para encerrar um processo; o TERM padrao deixa ele limpar, enquanto `-9` nao pode ser capturado e deixa arquivos abertos e locks para tras.killallMata processos por nome em vez de por PID; o nome precisa bater exatamente com o executavel, entao `killall chrome` nao pega um processo chamado "Google Chrome".pkillMata todos os processos que casam com um padrao; sem `-f` apenas o nome e comparado, e um padrao amplo derruba mais do que voce queria: rode pgrep com o mesmo padrao antes.pgrepImprime apenas os PIDs que casam com o padrao, com as mesmas regras do pkill, servindo de ensaio antes de matar qualquer coisa.jobsUm builtin do shell que numera apenas os trabalhos em segundo plano deste shell: os de outro terminal nao aparecem e voce os referencia como `%1`, nao por PID.bgRetoma em segundo plano um trabalho parado com Ctrl+Z; ele continua pertencendo a este shell, entao fechar o terminal o leva embora, a menos que use nohup ou disown.fgTraz de volta ao terminal um trabalho parado ou em segundo plano; funciona apenas com trabalhos deste shell, indicados por um numero como `%1`, nao pelo PID.nohupFaz um comando ignorar o sinal de hangup para sobreviver ao logout; ele nao coloca nada em segundo plano, entao voce mesmo acrescenta `&`, e a saida acumula em ./nohup.out.niceInicia um comando com prioridade de CPU menor; o valor vai de 19 (mais cede) a -20 (mais ganancioso), negativos exigem root, e afeta apenas CPU, nao disco (isso e ionice).reniceMuda a prioridade de um processo que ja esta rodando; um usuario comum so consegue torna-lo mais cedente, e recuperar a prioridade exige root.systemctlInicia, para e inspeciona servicos do systemd; `enable` so define o comportamento no boot, entao use `enable --now` para iniciar tambem, e rode `daemon-reload` depois de editar um unit.journalctlLe o log binario que o systemd coleta; sem /var/log/journal o log e apagado no reboot, e `-u` exige o nome exato do unit.serviceUm invólucro fino herdado da era SysV; numa maquina com systemd ele apenas repassa para systemctl e entende menos verbos.crontabGerencia a tabela de tarefas por usuario; cron roda quase sem PATH e nunca le seu perfil de login, entao use caminhos absolutos, e `crontab -r` apaga a tabela toda sem perguntar.atExecuta um comando exatamente uma vez no horario que voce indicar; o daemon atd precisa estar rodando (muitas vezes nem esta instalado) e a saida vai por e-mail, nao para a tela.uptimeMostra quanto tempo a maquina esta ligada e a carga media; esses tres numeros sao processos prontos na media de 1, 5 e 15 minutos, nao porcentagens, entao 4.00 em 4 nucleos significa cheio.freeConta quanta memoria e swap restam no Linux; a coluna a ler e available, nao free, porque o cache e devolvido quando preciso, e o macOS nao tem free (use vm_stat).vmstatImprime contadores de memoria, swap, disco e CPU em intervalos fixos; descarte a primeira linha, que e uma media desde o boot e nao o momento atual, e olhe primeiro as colunas si/so e wa.iostatMostra a taxa por disco e quanto os pedidos esperam; o primeiro bloco e uma media desde o boot, o Linux precisa do pacote sysstat e o macOS usa outras opcoes como `-w 1 -c 5`.lsblkApresenta os discos e suas particoes em arvore; nao mostra o espaco livre nao particionado (isso e fdisk ou parted) e existe apenas no Linux, entao no macOS use `diskutil list`.unameInforma o nome do kernel, sua versao e a arquitetura; nao diz a distribuicao, para isso leia /etc/os-release (ou `sw_vers` no macOS), e `-o` existe so no GNU.hostnameImprime ou define o nome da maquina; `hostname web01` dura so ate o proximo reboot, entao torne permanente com `hostnamectl` no Linux ou `scutil --set HostName` no macOS, e `-I` para todos os IPs existe apenas no Linux.dateImprime a hora atual no formato que voce quiser e faz aritmetica de datas; o formato depois de `+` e igual em todo lugar, mas deslocar uma data e `-d` no GNU e `-v` ou `-j -f` no macOS/BSD.envImprime todo o ambiente ou executa um comando com variaveis extras; essas variaveis valem apenas para aquela execucao e nada fica no seu shell.exportMarca uma variavel para que os processos filhos a herdem; ela morre com este shell, entao coloque em ~/.bashrc ou ~/.zshrc para manter, e um `VAR=x` sem export continua invisivel para os programas que voce roda.whichPercorre o PATH e diz onde esta o executavel com aquele nome; como olha somente o PATH, ele mente sobre aliases, funcoes e builtins do shell, e a resposta honesta vem de `type -a` ou `command -v`.typePergunta ao proprio shell o que um nome realmente e: alias, funcao, builtin ou arquivo, exatamente o que `which` nao ve porque so olha o PATH.lsofLista todo arquivo e socket aberto, e assim responde "quem esta segurando a porta 3000"; sem sudo voce so ve seus proprios processos, entao um resultado vazio nao significa que a porta esta livre.fuserEncontra, e se voce pedir mata, o que esta usando um arquivo, um ponto de montagem ou uma porta; `-k` envia SIGKILL sem chance de limpeza e existe apenas no Linux (psmisc), pois a versao do macOS tem so `-cfu`.watchReexecuta o mesmo comando a cada poucos segundos e redesenha a tela; coloque entre aspas qualquer coisa com pipe ou `*`, senao o shell aplica uma vez ao proprio watch, e o macOS nao o traz.timeoutExecuta um comando com limite de tempo e o corta quando o limite passa, saindo com 124; o sinal padrao e TERM, que um programa travado pode ignorar, entao acrescente `-k` para seguir com KILL (GNU coreutils, ausente no macOS).straceImprime cada chamada de sistema que um processo faz, e assim voce ve onde ele travou; a saida vai para stderr, redirecione com `2>&1`, precisa de permissao ptrace (geralmente sudo) e existe apenas no Linux (macOS tem dtruss).dmesgLe o buffer circular do kernel, o primeiro lugar para olhar depois de um problema de disco ou USB; e um buffer de tamanho fixo, entao linhas antigas ja se foram, e a maioria das distribuicoes exige root (macOS usa `log show`).

Rede28

Quando a conexão falha, estes mostram até onde ela chegou: o nome não resolve, não há rota ou a porta está fechada.

curlBaixa uma URL e imprime o corpo no terminal; ao contrario de um navegador, nao segue redirecionamentos sem `-L`, entao um 301 parece uma resposta vazia.wgetBaixa uma URL para um arquivo e segue redirecionamentos por conta propria; essa e a diferenca em relacao ao curl, que imprime no terminal se nao mandarem o contrario, e o macOS nao o traz.pingEnvia pedidos ICMP echo para ver se um host responde e quanto tempo leva; sem resposta nao significa que esta fora, porque muitos firewalls descartam ICMP enquanto TCP funciona.tracerouteLista os roteadores pelos quais um pacote passa ate o destino; uma linha `* * *` no meio nao significa caminho rompido, apenas que aquele roteador nao responde.digPergunta direto a um servidor DNS e mostra os registros como voltam; ignora /etc/hosts e o cache do sistema, entao a resposta pode diferir do que o navegador ve, e algumas distribuicoes exigem instalar dnsutils ou bind-utils.nslookupA ferramenta antiga de resolucao de nomes: ainda funciona, mas o formato de saida e o codigo de saida sao inconsistentes o bastante para nao servir em scripts, e o dig assumiu seu lugar.hostResponde a uma consulta de nome em duas ou tres linhas curtas com enderecos e servidores de correio; e o mais pratico para uma checagem rapida, mas para ver todos os registros use dig.ssA forma moderna de listar sockets abertos no Linux, sucessora do netstat e muito mais rapida num host movimentado; note que `-p` so revela o processo dono quando voce e root.netstatA forma antiga de ver sockets e a tabela de rotas; no Linux ela deu lugar ao ss e muitas vezes nem esta instalada, e embora o macOS a mantenha, ela nao diz qual processo possui um socket: isso o lsof responde.ipO comando unico do Linux para enderecos, rotas e tabela de vizinhos, substituindo ifconfig, route e arp; o que voce mudar com ele desaparece no reboot, a menos que escreva tambem na configuracao de rede.ifconfigO comando antigo para ver e mexer em interfaces de rede; no Linux `ip addr` o substituiu, pode nem estar instalado e nao mostra todos os enderecos adicionados por ip — no macOS, porem, ele ainda e a ferramenta de verdade.routeLe e edita a tabela de rotas do kernel, mas no Linux cedeu lugar a `ip route`, e no BSD/macOS a sintaxe e outra, como `route -n get default`, entao os exemplos nao servem nos dois lados.arpMostra a tabela de enderecos MAC dos vizinhos na mesma rede local; nada alem do roteador aparece ali, e no Linux a ferramenta atual e `ip neigh`.nc (netcat)Abre uma conexao TCP ou UDP crua para ver se uma porta responde e encaminha bytes entre duas maquinas; tres netcats incompativeis dividem o nome (OpenBSD, GNU, ncat do Nmap), entao `-z` ou `-p` pode simplesmente nao existir no seu.telnetAbre uma sessao TCP em texto puro na qual tudo viaja sem cifra, entao nunca deve ser usada para login (isso e ssh); o uso que resta e checar se uma porta responde, e voce sai com Ctrl+] e depois quit.sshAbre um shell cifrado em outra maquina; o ssh recusa de saida uma chave privada que outros possam ler, entao use `chmod 600`, e a porta e `-p` aqui mas `-P` no scp e no sftp.ssh-keygenCria um par de chave publica e privada; para o servidor vai apenas a metade `.pub`, e uma chave feita sem passphrase e um arquivo simples com o qual qualquer um que o copie consegue entrar.ssh-copy-idAcrescenta sua chave publica ao ~/.ssh/authorized_keys do servidor para ele parar de pedir senha; o login por senha precisa continuar aberto nessa primeira vez, e `-i` recebe o arquivo `.pub`, nao a chave privada.sftpUma ferramenta interativa de transferencia sobre a conexao ssh; a opcao de porta e `-P` maiusculo, nao o `-p` do ssh, e ela nao roda comandos remotos: apenas seus proprios put, get e ls.scpCopia arquivos por ssh de uma vez; a porta e `-P` maiusculo, o lado remoto precisa de dois-pontos no caminho, e para algo grande ou repetido o rsync e melhor porque pula o que nao mudou e retoma.iptablesEdita o filtro de pacotes em execucao; as regras sao avaliadas de cima para baixo e a primeira que casa vence, entao um DROP colocado depois de um ACCEPT nunca dispara, as regras desaparecem no reboot se nao salvas, e definir a politica padrao como DROP antes de liberar a porta 22 tranca voce fora de uma maquina remota.ufwUm invólucro amigavel do iptables no Debian e no Ubuntu; libere SSH antes de dar `enable` ou voce corta a propria sessao, e o Docker publica portas direto no iptables, onde as regras do ufw nao alcancam.tcpdumpCaptura os pacotes que passam no cabo; exige root, o que capturar se escreve depois das opcoes na sintaxe propria de filtro como `port 443 and host x`, e capturar sem filtro numa interface movimentada soterra o terminal na hora.whoisConsulta o registro de um dominio ou bloco de IP; os campos pessoais em geral estao ocultos e cada servidor de TLD formata a resposta do seu jeito, entao analisar essa saida num script quebra facil.nmapVarre um host para ver quais portas respondem; `-sS` e `-O` exigem root, e escanear uma maquina que nao e sua fica registrado como ataque nos logs dela e e ilegal em alguns paises, entao limite-se as suas redes.openssl s_clientAbre uma conexao TLS crua para inspecionar o certificado e o handshake; sem `-servername`, um servidor com muitos sites num endereco entrega o certificado padrao, e sem `< /dev/null` ele fica ali esperando entrada.speedtestMede a velocidade da linha empurrando trafego real para um servidor proximo; nao vem instalado em nenhum sistema e dois programas diferentes dividem o nome (o speedtest da Ookla e o speedtest-cli em Python), com opcoes distintas.mtrJunta traceroute e ping numa tabela que se atualiza sem parar, a ferramenta certa para perda intermitente; perda num salto do meio geralmente e aquele roteador limitando as respostas, e so a perda que continua ate o ultimo salto e real.

Compactação14

Empacotar e compactar são coisas diferentes: tar empacota, gzip encolhe e .tar.gz é os dois.

tarJunta arquivos em um só pacote, mas não comprime por conta própria: quem faz isso é `-z` (gzip), `-j` (bzip2) ou `-J` (xz); escolha exatamente um entre `-c` para criar, `-x` para extrair e `-t` para listar, e deixe `-f` como última opção, pois o nome do pacote vem logo depois dele.gzipComprime um único arquivo em .gz e, por padrão, apaga o original ao terminar, então guarde-o com `-k` ou escrevendo na saída padrão com `-c`; ele nunca junta vários arquivos, e é por isso que o tar vem antes.gunzipDescomprime um .gz de volta ao arquivo original e remove o .gz quando dá certo: `-k` o conserva, `-f` é necessário se já existe um arquivo com aquele nome, e `-c` manda o conteúdo para a saída padrão sem gravar nada em disco, igual ao zcat.zipDiferente do tar, ele já traz a própria compressão e é o formato que o Windows abre sem instalar nada; uma pasta exige `-r`, senão você guarda só a entrada do diretório e nada do que há dentro, e a senha de `-e` é o ZipCrypto antigo e fraco.unzipExtrai um .zip e, sem `-d`, despeja tudo no diretório atual, então rode `-l` antes para ver se existe uma pasta raiz dentro; nomes de zips feitos em Windows antigos pedem `-O CP932`, e a senha passada com `-P` fica visível no histórico do shell e no ps.bzip2Comprime mais que o gzip em troca de demorar mais e, como o gzip, apaga o original e deixa só o .bz2 a menos que você passe `-k`; a opção dele no tar é `-j`, e descomprimir é `-d`, exatamente o que o bunzip2 faz.xzGera a menor saída dos três formatos comuns, mas é lento e a `-9` pede cerca de 700 MB de memória; roda em um só núcleo se você não acrescentar `-T0`, apaga o original sem `-k`, e a opção dele no tar é o `-J` maiúsculo.zcatManda o conteúdo de um .gz para a saída padrão sem descompactar nada em disco, que é como se faz grep num log rotacionado do jeito que ele está; `-f` deixa passar também arquivos não comprimidos na mesma passada, e bzip2, xz e zstd têm seus próprios bzcat, xzcat e zstdcat.7zUsa-se com um verbo na frente — `a` para adicionar, `x` para extrair com os caminhos, `e` para achatá-los, `l` para listar —, lê muito mais que .7z, também zip, tar e rar, e comprime mais que a maioria; o diretório de saída vem colado ao `-o`, sem espaço, e `-mhe=on` junto de `-p` é o que também esconde os nomes.ddCopia bloco a bloco, e é assim que uma imagem de instalação vai para um dispositivo; o que você escrever em `of=` é sobrescrito a partir do bloco zero, sem confirmação e sem volta, então confirme o dispositivo com lsblk logo antes de apertar Enter, use `bs=4M` pela velocidade e `status=progress` (Ctrl+T no macOS) para acompanhar.splitCorta um arquivo grande em pedaços; por padrão corta por linhas, 1000 de cada vez, então use `-b 100M` quando queria tamanho, os pedaços se chamam xaa, xab e assim por diante se você não der um prefixo, e voltam a ser um só com um `cat part_* > file`, que funciona porque os sufixos ficam em ordem.cpioUm arquivador antigo que recebe da entrada padrão a lista de nomes a empacotar, e por isso quem costuma alimentá-lo é o find; `-o` cria o arquivo, `-i` extrai, `-t` lista, `-H newc` é o formato portátil que as imagens initramfs usam, e `--no-absolute-filenames` impede que um arquivo de outra pessoa escreva em caminhos absolutos.zstdO moderno: chega ao tamanho do gzip várias vezes mais rápido e, em `-19`, fica perto do tamanho do xz numa fração do tempo dele; diferente do gzip, mantém o original por padrão (`--rm` apaga), `-T0` usa todos os núcleos e no tar ele é chamado com `--zstd`.rarUm formato proprietário em que só o extrator é gratuito: criar um arquivo exige o binário rar pago, enquanto `unrar x` — ou `7z x`, sem instalar nada da RARLAB — abre o que alguém lhe mandou; `x` mantém os caminhos guardados e `e` os achata, `-hp` esconde também os nomes e `-v100m` divide o arquivo em volumes.

Permissões15

Modo numérico e simbólico dizem a mesma coisa: 755 e u=rwx,go=rx são a mesma permissão.

chmodDefine os bits de permissão de arquivos e diretórios; chmod -R 755 também torna arquivos comuns executáveis, então use o X maiúsculo para deixá-los em paz.chownMuda o dono e o grupo de um arquivo; só o root pode passar um arquivo para outra pessoa, e por isso quase sempre precisa de sudo.chgrpMuda apenas o grupo do arquivo, o que chown também faz com :group; sem ser root, você só pode atribuir um grupo do qual participa.umaskDecide quais bits de permissão são retirados dos arquivos novos; ela subtrai em vez de conceder, então 022 dá 644 para arquivos e 755 para diretórios, e não mexe no que já existe.sudoExecuta um comando como outro usuário, root por padrão; o redirecionamento em sudo cmd > file é aberto pelo seu shell, então falha em arquivo do root, e aí se usa tee.suVira outro usuário com a senha dele, ao contrário do sudo que pede a sua; sem o traço você mantém seu PATH, causa comum de command not found.idMostra os ids de usuário e grupo com que um processo roda; id -u igual a 0 significa root, o jeito padrão de um script checar privilégio.groupsLista os grupos de um usuário; um grupo recém-adicionado com usermod só aparece no próximo login, porque a lista é fixada quando a sessão começa.whoamiMostra o nome de usuário efetivo, não o do login, então dentro de sudo ou su ele diz root.passwdTroca a senha de login e guarda o hash em /etc/shadow; o macOS não tem quase nenhuma das opções do Linux e usa dscl ou os Ajustes.getfaclMostra a lista de controle de acesso, as permissões extras por usuário além de dono, grupo e outros; é do Linux com o pacote acl, já o macOS exibe sua própria ACL com ls -le.setfaclConcede direitos a um usuário ou grupo extra sem trocar o dono; havendo ACL, o ls mostra um + depois do modo, e a entrada mask pode limitar silenciosamente o que você deu.chattrAplica atributos no nível do sistema de arquivos, como o imutável; com +i até o root precisa limpar a marca antes de editar, e só funciona no Linux em ext4, xfs ou btrfs.xattrLê e remove atributos estendidos no macOS, em geral com.apple.quarantine, a marca por trás do aviso de app danificado; no Linux usam-se getfattr e setfattr.visudoEdita /etc/sudoers com trava e checagem de sintaxe antes de salvar; mexer nesse arquivo à mão e errar deixa todos sem sudo, e é justo isso que o visudo evita.

Pacotes e runtimes25

A pergunta é sempre o que vai onde: dentro deste projeto ou na máquina toda.

npm installBaixa para node_modules as dependências que package.json pede e atualiza package-lock.json; desde o npm 7 as peer também são instaladas, e --production deu lugar a --omit=dev.npm ciApaga node_modules e instala exatamente o que package-lock.json diz; nunca altera o lockfile e falha de imediato se ele divergir do package.json, por isso o CI usa este em vez de install.npm runExecuta um comando da seção scripts do package.json; argumentos para o script exigem um -- antes, e só start e test podem ser chamados sem run.npm initCria um package.json; npm init <nome> é outra coisa: baixa e roda create-<nome>, como o npx faz.npxExecuta o binário de um pacote, preferindo node_modules/.bin e baixando-o temporariamente se faltar; como um erro de digitação pode trazer um pacote alheio, --no restringe ao que é local.yarn addAdiciona um pacote e atualiza o yarn.lock; yarn sozinho significa install, e o Yarn 2 removeu o yarn global add, então ferramentas de uso único vão por yarn dlx.pnpm addGuarda o pacote em um armazém compartilhado e o liga em node_modules; na raiz de um workspace o pnpm recusa um add simples e pede -w ou --filter.npm auditRelata vulnerabilidades conhecidas no que está instalado; fix --force traz versões maiores que quebram, e avisos escondidos em dependências só de desenvolvimento muitas vezes não têm solução.npm publishEnvia o pacote para o registro; um nome com escopo é privado por padrão, daí o --access public, e um número de versão nunca pode ser reaproveitado, então confira a lista de arquivos com --dry-run.node --versionImprime a versão do node que vem primeiro no PATH; por isso o terminal do editor ou um job de CI podem mostrar outra quando existe um gerenciador de versões.nvm useTroca qual Node o shell atual usa; a mudança vale só naquele shell, então um terminal novo ou um job de CI volta ao padrão, e como nvm é uma função de shell, um script ou Makefile precisa carregar nvm.sh antes.brew installInstala uma bottle pré-compilada no macOS e no Linux; aplicativos gráficos pedem --cask, e atualizar é tarefa de brew update e brew upgrade, não do install.apt-get installInstala a partir da lista de pacotes já baixada, então uma lista velha resulta em "Unable to locate package" até rodar apt-get update; apt-get mantém uma interface estável para scripts, enquanto o apt é feito para pessoas.apt updateApenas atualiza as listas de pacotes, então apt upgrade precisa vir depois para instalar algo; um contêiner novo tem a lista vazia, e por isso este é o primeiro comando.dnf installInstala dos repositórios habilitados resolvendo dependências e atualiza os metadados por conta própria, sem o passo de update do apt; no RHEL 8 e depois yum é um link para o dnf, e o Fedora 41 passou ao dnf5.pacman -SInstala um pacote dos repositórios sync no Arch; como a distribuição é rolling, atualizar a lista com -Sy e instalar sem upgrade gera uma atualização parcial que quebra bibliotecas, então use -Syu.pip installInstala um pacote no Python ativo; chamar como python -m pip evita o caso clássico de um pip que pertence a outro interpretador, e desde a PEP 668 um Python do sistema recusa instalar fora de um ambiente virtual.pip freezeImprime cada pacote instalado com a versão exata, pronto para redirecionar para requirements.txt; lista também as dependências transitivas, então precisa rodar dentro do ambiente virtual.python -m venvCria um interpretador isolado e o site-packages dentro de uma pasta; criar não faz nada até você ativar ou chamar .venv/bin/python direto, e os caminhos ficam gravados, então renomear a pasta depois quebra tudo.docker runCria e inicia um contêiner novo a partir da imagem toda vez, então rodar duas vezes deixa dois contêineres e reiniciar um existente é docker start; sem -p nada é alcançável do host, e sem -v o que for escrito morre com o contêiner.docker psLista só os contêineres em execução; um que saiu logo após iniciar fica invisível até usar -a, e é ali que se olha quando docker run parece não ter feito nada.docker buildConstrói uma imagem a partir de um Dockerfile; o ponto no fim é o contexto enviado ao daemon, então uma pasta gorda deixa o build lento até o .dockerignore enxugar, e o COPY só vê arquivos dentro desse contexto.docker compose upSobe todos os serviços do compose.yaml como um projeto; o docker-compose com hífen é a v1 aposentada e docker compose é o plugin v2, e contêineres existentes são reaproveitados a menos que use --build ou --force-recreate.docker execExecuta outro processo dentro de um contêiner que já está rodando; falha se ele estiver parado, e imagens slim não têm bash, então entra-se com sh.docker logsMostra o que o processo principal do contêiner escreveu em stdout e stderr; um app que grava log em arquivo interno não aparece aqui, e os logs desaparecem junto com o contêiner.

Como ler

  • Os colchetes [ ] marcam uma parte que você pode omitir.
  • As reticências … indicam que você pode listar vários.
  • As opções diferenciam maiúsculas: em alguns comandos -r e -R fazem coisas diferentes.

Perguntas

Q. Por que os nomes dos comandos não são traduzidos?

Porque você digita como está. Um ls traduzido é um nome que o shell não conhece. As opções ficam pelo mesmo motivo: só as explicações mudam de idioma.

Q. As opções são diferentes no macOS e no Linux.

São. O macOS traz ferramentas BSD, então faltam opções do GNU: sed -i pede um argumento e ps não aceita -ef. Onde divergem, a descrição diz de qual sistema é.

Q. Como identifico os comandos que não dão para desfazer?

A descrição diz. rm não passa pela lixeira, dd sobrescreve um disco se o of= estiver errado, e git reset --hard e git clean -fd jogam fora trabalho não comitado.