Início·Comandos de terminal
Publicidade

Garanta seu bônus em uma corretora de cripto

Bônus que você recebe só por se cadastrar. As condições são as que cada corretora anuncia.

Referência de comandos de terminal

226 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ção13

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.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

QPor 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.

QAs 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 é.

QComo 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.