13 pontos por GN⁺ 2023-06-28 | 5 comentários | Compartilhar no WhatsApp
  • Dá para controlar recursos próprios do macOS, como repouso, área de transferência, Finder, Spotlight e atualizações, usando apenas o Terminal, reduzindo tarefas repetitivas na GUI
  • caffeinate, pmset e taskpolicy afetam diretamente o comportamento do sistema, como impedir o repouso, verificar o estado de energia e ajustar a prioridade de execução de processos
  • Com pbcopy, pbpaste, open, screencapture e say, fica fácil colocar tarefas do dia a dia em scripts, como área de transferência, abertura de arquivos, capturas de tela e saída de voz
  • sips, textutil, mdfind e mdls são usados como ferramentas de processamento de arquivos para automatizar conversão de imagens e documentos, buscas baseadas no Spotlight e verificação de metadados
  • networkQuality, networksetup, softwareupdate e system_profiler permitem verificar rapidamente qualidade da rede, Wi‑Fi/DNS, atualizações do SO e informações de hardware e software

Escopo dos comandos exclusivos do macOS

  • Além das ferramentas Unix padrão, o macOS inclui ferramentas de linha de comando dedicadas que acessam recursos do sistema operacional
  • O uso detalhado de cada comando pode ser consultado com man <command>
  • O ambiente de referência é o macOS Sonoma

Energia, repouso e controle de processos

  • caffeinate - Impedir que o Mac entre em repouso

    • Ao executar caffeinate sem flags nem argumentos, o Mac não entra em repouso enquanto o comando estiver em execução
    • caffeinate -u -t <seconds> aplica a prevenção de repouso pelo número de segundos especificado
    • Ao adicionar a flag -d, também impede o repouso da tela
    • Com -w <pid> para especificar um processo existente, o caffeinate também termina quando esse processo terminar
    • caffeinate <command> inicia o comando fornecido como um novo processo e impede o repouso até que esse processo termine
  • pmset - Verificar e controlar o estado de gerenciamento de energia

    • pmset -g imprime as informações de configuração de energia disponíveis
    • pmset -g assertions mostra as assertions relacionadas a energia criadas por outros processos, útil para encontrar processos que impedem o Mac de entrar em repouso
    • pmset -g thermlog exibe informações de processos com throttling, servindo de referência ao executar benchmarks
    • pmset displaysleepnow coloca imediatamente apenas a tela em repouso, sem suspender o sistema inteiro
    • pmset sleepnow coloca imediatamente todo o sistema em repouso
  • taskpolicy - Controle de escalonamento de processos

    • taskpolicy -b <command> executa o comando fornecido em segundo plano e, em Macs com Apple silicon, ele roda apenas nos núcleos de eficiência
    • taskpolicy -b -p <pid> rebaixa um processo existente para execução em segundo plano
    • taskpolicy -B -p <pid> remove o estado de execução em segundo plano do processo especificado
      • Em Macs com Apple silicon, depois disso ele pode rodar nos núcleos de eficiência ou nos núcleos de desempenho
      • Esse comportamento se aplica apenas a processos rebaixados para segundo plano, não a processos iniciados em segundo plano desde o começo
    • taskpolicy -s <command> inicia o comando fornecido em estado suspenso, permitindo anexar um depurador no momento em que a execução começar

Área de transferência, abertura de apps, capturas de tela e saída de voz

  • pbcopy, pbpaste - Usar a área de transferência do sistema

    • <command> | pbcopy copia a saída do comando para a área de transferência
    • pbpaste envia o conteúdo da área de transferência para a saída padrão
  • open - Abrir arquivos e aplicativos

    • open -a <app> <file> abre o arquivo especificado com um aplicativo específico
    • Ao adicionar a flag -g, abre o arquivo em segundo plano, mantendo o foco no aplicativo atual
    • open . abre o diretório atual em uma nova janela do Finder
    • open -R <file> mostra o arquivo especificado em uma nova janela do Finder
  • screencapture - Capturar screenshots

    • screencapture -c tira uma captura de tela e a copia para a área de transferência
    • screencapture <file> salva a captura de tela no arquivo especificado
    • Ao adicionar a flag -T <seconds>, aguarda o número de segundos especificado antes da captura
  • say - Conversão de texto em fala

    • say <message> reproduz a mensagem fornecida em voz
    • say -f input.txt -o output.aiff cria um audiobook a partir do arquivo de texto especificado

Imagens, documentos, busca e metadados

  • sips - Manipulação de imagens

    • sips -z <height> <width> <image> redimensiona a imagem para o tamanho especificado, ignorando a proporção original
    • sips -Z <size> <image> ajusta o lado mais longo para o tamanho especificado, preservando a proporção
    • sips -c <height> <width> <image> faz um crop no tamanho especificado, tomando como referência o centro da imagem original
    • sips -r <degrees> <image> gira a imagem pelo ângulo especificado
    • O comportamento padrão é sobrescrever destrutivamente a imagem de entrada; se precisar de outro caminho de saída, use a flag -o
    • O arquivo de saída deve ter a mesma extensão do arquivo de imagem de entrada
  • textutil - Conversão de arquivos de documento

    • textutil consegue converter arquivos entre formatos Microsoft Word, texto simples, rich text e HTML
    • textutil -convert html journal.doc converte journal.doc em journal.html
    • Os valores que podem ser usados com -convert são txt, html, rtf, rtfd, doc e docx
  • mdfind, mdls - Busca do Spotlight e metadados

    • mdfind <query> realiza uma busca por palavra-chave no Spotlight com a consulta fornecida
    • mdfind kMDItemAppStoreHasReceipt=1 encontra todos os apps instalados pela Mac App Store
    • mdfind -name <name> busca todos os arquivos que correspondem ao nome especificado
    • A flag -onlyin <dir> permite limitar o escopo da busca a um diretório específico
    • mdls <file-path> imprime todos os metadados do Spotlight associados ao arquivo especificado

Rede, atualizações e informações do sistema

  • networkQuality - Medição de velocidade da internet

    • networkQuality executa um teste de velocidade da internet no Mac
    • Ao adicionar a flag -v, é possível ver informações mais detalhadas
    • A flag -I executa o teste em uma interface de rede específica
  • networksetup - Verificação e configuração de ajustes de rede

    • networksetup -listnetworkserviceorder imprime a lista de serviços de rede disponíveis
    • networksetup -getinfo <networkservice> mostra informações do serviço de rede especificado
    • networksetup -getdnsservers <networkservice> imprime os servidores DNS do serviço de rede especificado
    • networksetup -setairportnetwork <device> <network> [password] conecta à rede Wi‑Fi especificada
    • Na maioria dos casos, o argumento <device> é "en0"
  • softwareupdate - Gerenciamento de atualizações do SO

    • softwareupdate --list imprime as atualizações de software disponíveis
    • sudo softwareupdate -ia instala todas as atualizações disponíveis
    • softwareupdate --fetch-full-installer --full-installer-version <version> tenta baixar o instalador completo da versão especificada do macOS em /Applications
  • system_profiler - Consulta de informações do sistema

    • Por padrão, system_profiler imprime todas as informações de sistema disponíveis, e o volume de saída costuma ser grande
    • system_profiler <datatype> imprime apenas as informações do subsistema especificado
    • system_profiler -listDataTypes mostra a lista de todos os subsistemas dos quais é possível obter informações
    • Tipos de dados úteis incluem:
      • system_profiler SPHardwareDataType: imprime o resumo de hardware, o nome do modelo e o número de série do Mac atual
      • system_profiler SPSoftwareDataType: imprime o resumo de software do Mac atual e o número exato da versão do macOS
      • system_profiler SPPowerDataType: imprime informações de energia e bateria, incluindo a potência atual em AC e a contagem de ciclos da bateria
      • system_profiler SPDeveloperToolsDataType: imprime as ferramentas de desenvolvimento do Xcode atualmente ativas e as versões dos SDKs

5 comentários

 
dansepo 2023-07-07

Comandos de terminal avançados do MacBook que ajudam na vida (para usuários comuns)
https://www.youtube.com/watch?v=EhiqpFtmjig

 
xguru 2023-06-28

Comandos CLI avançados do macOS

Eu tinha postado um resumo do mesmo texto há 7 meses, mas este resumo aqui está mais interessante de ver.. T_T

 
edunga1 2023-06-28

Acho até melhor assim, porque mesmo resumindo nesse nível que você fez, dá para entender sem dificuldade haha

 
botplaysdice 2023-06-28

Não é bem assim... haha

 
GN⁺ 2023-06-28
Comentários do Hacker News
  • Com sips e iconutil juntos, dá para criar um arquivo .icns para app a partir de um único PNG 1024×1024 sem ferramentas de terceiros
    Crie o iconset com mkdir MyIcon.iconset, gere os tamanhos 16/32/128/256/512 e os arquivos @2x com sips -z e depois execute iconutil -c icns MyIcon.iconset
    De bônus, também dá para criar um .ico com ffmpeg -i MyIcon.iconset/icon_256x256.png icon.ico
    Só fico na dúvida, por causa da forma como o sips reduz PNGs, se é melhor gerar a versão de 16 px direto a partir de 1024 px ou ir reduzindo em etapas a partir de 32 px

    • Se o arquivo inicial for SVG, em vez de cp dá para usar qlmanage primeiro para criar um PNG 1024×1024
      qlmanage -t -s 1024x1024 -o MyIcon.iconset/Icon1024.png icon.svg
    • Se você quiser ícones pequenos realmente bonitos, especialmente 16×16 ou 32×32, precisa reduzir e depois retocar manualmente para ficarem nítidos
      Mas, olhando os ícones de sistema do macOS, hoje em dia já não parece mais que eles façam esse ajuste manualmente
  • Gosto especialmente de pbcopy e pbpaste da lista
    Quando estou lidando com JSON compactado, é muito prático abrir o iTerm e executar pbpaste | json_pp | pbcopy, porque a saída formatada vai direto para a área de transferência

    • Como uso bastante o padrão pbpaste | something | pbcopy, vale a pena transformar isso em função de shell
      Dá para usar como pbfilter json_pp, pbfilter base64 -d, pbfilter sed 's/this/that/'
      Se você executar apenas pbfilter sem argumentos, ele também pode funcionar como um filtro para remover a formatação da área de transferência e deixar só texto puro
      Só que isso não funciona com aliases, pipelines nem expressões complexas; o comando do filtro precisa ser um comando comum ou função com seus argumentos
    • Esse fluxo é uma forma poderosa e elegante de resolver problemas com texto
      Por exemplo, linhas em branco duplas que surgem ao copiar e colar no estilo Windows podem ser corrigidas com alias winlines="sed '/^$/{$!{N;s/\n//;};}'" e alias pbw="pbpaste | winlines | pbcopy"
      No Linux, também dá para imitar algo parecido com o macOS usando alias pbcopy='xsel --clipboard --input', alias pbpaste='xsel --clipboard --output'
    • É bem irritante que essas ferramentas só funcionem com texto simples e RTF
      No X11 existe xclip[0], no Wayland existe wl-clipboard[1], e eles também suportam formatos binários por meio de parsing de cabeçalhos ou definição explícita de tipos MIME
      Assim, dá para copiar imagens no terminal e colá-las em programas GUI como navegadores ou clientes de chat, ou fazer o caminho inverso, o que também é útil em scripts shell de automação de desktop
      No macOS, é preciso recorrer a osascript para chamar AppleScript e usar set the clipboard to...
      [0] https://github.com/astrand/xclip
      [1] https://github.com/bugaevc/wl-clipboard
    • Também é legal usar pbcopy/pbpaste junto com o celular
      Se você copiar um texto no celular, pode trazê-lo direto para a linha de comando do Mac com pbpaste
    • Para editar o conteúdo da área de transferência, uso pbpaste | vipe | pbcopy
      Aqui, vipe é um utilitário que insere um editor, normalmente o vim, no meio do pipe, e pode ser visto em https://joeyh.name/code/moreutils/
  • Não é uma ferramenta de linha de comando, mas o Network Link Conditioner também é muito bom
    Ele permite simular uma rede muito ruim, com latência, largura de banda, perda de pacotes etc., o que é útil para testes
    Em reuniões que insistem para você ligar a câmera, também dá para piorar a conexão de propósito, mostrar vídeo todo blocado e voz de robô, e depois, quando todo mundo pedir para desligar o vídeo, “magicamente” fazer tudo voltar ao normal

    • Comcast também faz a mesma coisa em macOS, BSD e Linux, e ainda tem um nome excelente
    • Toxiproxy é uma ferramenta parecida que pode ser usada em outros ambientes, e ajudou a testar e melhorar código de rede sob condições ruins, como timeout, retries e perda de pacotes
    • Eu não sabia que existiam ferramentas assim, e também não sabia que o pacote “additional tools for X-Code” tinha mais ferramentas legais que eu desconhecia
      https://developer.apple.com/download/all/
    • No Linux, também dá para fazer algo parecido de forma ultra avançada com ferramentas de QoS de rede
      https://tldp.org/HOWTO/Traffic-Control-HOWTO/components.html
    • NLC é uma interface gráfica para controlar dummynet e PF(packet filter)
      Ela configura regras para injetar latência nos pacotes ou descartar uma certa porcentagem deles conforme o perfil
      No macOS, com dnctl e pfctl, dá para fazer algo parecido — e até mais do que isso
  • Também é obrigatório mencionar o afplay para reprodução de áudio
    Com ele dá para criar um player de MP3 simples na linha de comando
    Também existe o utilitário say para síntese de voz, que suporta o formato TUNE, permitindo ajustar toda a melodia e o timing da fala e fazer com que soe como se tivesse emoção
    O guia Speech Synthesis Programming Guide da Apple está em https://josh8.com/blog/img/speech-synthesis.pdf, e um texto relacionado está reunido em https://josh8.com/blog/commandline-audio-mac.html

    • Infelizmente, o formato TUNE acabou sendo algo próximo de um beco sem saída evolutivo
      A última geração de síntese de voz a suportá-lo foi a voz Alex, incluída em 2007, e parece muito improvável que volte a aparecer
      O controle preciso da síntese e a naturalidade estão, em essência, em tensão entre si, e a segunda é muito mais valiosa
    • Uma pequena correção: o comando para ver a lista de vozes é say -v '?'
  • Para aumentar a produtividade ou ao fazer apresentações, escondo todos os ícones e pastas da área de trabalho
    Se você executar defaults write com.apple.finder CreateDesktop 0 seguido de killall Finder, eles somem, e se mudar o valor para 1, voltam a aparecer
    Também criei um alias bash para alternar isso, e o gist está em https://gist.github.com/berndverst/6f58c0d6aedddb6c06c23e57d...

    • Uma das primeiras coisas que faço ao configurar um novo Mac é desligar a área de trabalho
      Ainda assim, uso bastante ~/Desktop, então ela é uma das duas pastas que deixo no Dock; a outra é ~/Downloads
      Por outro lado, a chegada do Stacks ao desktop do macOS foi excelente, e é um recurso que sempre mostro para quem vive com a área de trabalho cheia de arquivos
    • Uso esse método há mais de 10 anos e, quando eu era professor, até o atribuí a uma combinação de teclas
      Vale a pena agrupá-lo com outras configurações úteis em contexto de apresentação
  • Boa lista, e também existe o hidutil
    https://developer.apple.com/library/archive/technotes/tn2450...
    Por exemplo, em um teclado de PC dá para trocar a tecla Ins, quase inútil no macOS, por algo como PC Execute, e depois capturá-la no Keyboard Maestro para remapeá-la de novo

    • Com hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000035}]}', dá para trocar a tecla paragraph no canto superior esquerdo de um teclado europeu por uma crase muito mais útil
    • Existe um gerador razoável para criar esses mapeamentos
      https://hidutil-generator.netlify.app/
    • Não dá para confundir hidutil com hdiutil
      Por exemplo, você pode desmontar um drive USB com hdiutil detach /Volumes/some-usb-drive ou criar um ISO com hdiutil makehybrid -joliet -o foo.iso ./srcfolder/
  • Há alguns anos, ao criar um script para procurar algo em um grande volume de dados e avisar quando terminasse, coloquei um comando say no final
    Esqueci disso e fui dormir, e horas depois acordei num pulo com uma voz no escritório de casa que parecia um “intruso” falando com um cúmplice; só relaxei de verdade quando entendi o que estava acontecendo

    • Como uso Pushover para algumas notificações, há muito tempo criei um pequeno script bash chamado push que recebe um título e um corpo opcional
      Era prático usar algo como ./longRunningCommand && push "Task Done" "Here is a body", e eu também o usava junto com um script beep que só emitia um som quando eu estava na frente do computador para indicar a conclusão
    • Gosto de usar a amostra research complete de StarCraft para esse tipo de coisa
    • De forma parecida, também existe um módulo do Metasploit que faz um Mac comprometido executar o comando say
      Nunca vi isso sendo usado na prática, mas fico esperando o dia em que aparecerá uma thread no Twitter começando com “usei um módulo do msf que chamava say no notebook do cliente”
    • Se você costuma deixar várias abas do terminal abertas, é fácil iniciar um comando demorado, mudar para outra aba e esquecer dele
      Por isso, adicionei um script de conclusão de comando no fish que usa afplay para emitir um bip se a tarefa levou mais de 5 segundos
      Isso ajuda a retomar o foco em tarefas “longas o bastante para serem esquecidas”
    • Eu pagaria uma boa grana se desse para trocar a voz por uma voz do Arnold
  • O utilitário de linha de comando diskutil do macOS também merece elogios
    Hoje tive um problema com alguns slices de disco que a interface gráfica Disk Utility do macOS não conseguia corrigir, resquícios de quando testei o Asahi Linux no passado
    Imaginei que deveria haver um jeito de resolver com a CLI do diskutil e encontrei a solução na thread a seguir
    https://apple.stackexchange.com/questions/411544/cant-reclai...
    Agora posso voltar a usar o disco inteiro no macOS

    • O diskutil é excelente, mas o estado atual do Disk Utility.app é lamentável
      Depois da transição para APFS, ele claramente não recebeu manutenção adequada, e há casos em que o diskutil funciona mas o app GUI falha completamente em fazer a mesma coisa
      Antes do redesenho da interface, era uma ferramenta robusta que ao menos informava por que tinha falhado; agora virou algo parecido com uma interface LEGO Duplo para bebês, que mal consegue formatar um pen drive
  • Quando você não lembra de um comando ou parâmetro, vale a pena olhar o um também
    https://github.com/promptops/cli
    Por exemplo, se você digitar um prevent my mac from sleeping for 30m, ele retorna algo como caffeinate -u -t 1800

  • open é um comando simples e ótimo, que eu uso o tempo todo
    alias tab='open . -a iterm', alias phpstorm='open -a "PhpStorm"', alias smerge='open -a "Sublime Merge"'; deixo assim configurado e uso com mais frequência do que as caixas de diálogo Open/Recents de cada app

    • Entre as opções não mencionadas, também existe -n
      Ela permite executar várias instâncias do mesmo aplicativo e, antigamente, era o utilitário que eu mais usava pessoalmente
      Hoje em dia uso menos, porque diminuiu a quantidade de apps com problemas de design tão graves
    • O autocompletar com Tab de open -a ... parece horrível há anos, porque a Apple não atualiza a definição de completion
      Deixei uma solução alternativa nesta resposta do Stack Overflow: https://stackoverflow.com/a/63097652
    • Sublime Text e Sublime Merge já incluem utilitários de CLI por padrão e ainda têm recursos extras
      Você pode usar /Applications/Sublime Merge.app/Contents/SharedSupport/bin/smerge e /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl
    • Criei um script para abrir arquivos com rofi
      https://github.com/davatorium/rofi
      A aparência é como em https://i.imgur.com/Hm9TGeV.jpg
      No terminal do VS Code, se você usar o alias o, ele abre a partir da localização atual, e de lá você pode procurar um arquivo e abri-lo no editor
    • Para abrir uma nova janela do Finder no diretório atual do terminal, basta usar alias finder='open .'