- 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,pmsetetaskpolicyafetam 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,screencaptureesay, 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,mdfindemdlssão usados como ferramentas de processamento de arquivos para automatizar conversão de imagens e documentos, buscas baseadas no Spotlight e verificação de metadadosnetworkQuality,networksetup,softwareupdateesystem_profilerpermitem 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
caffeinatesem 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, ocaffeinatetambé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
- Ao executar
-
pmset- Verificar e controlar o estado de gerenciamento de energiapmset -gimprime as informações de configuração de energia disponíveispmset -g assertionsmostra as assertions relacionadas a energia criadas por outros processos, útil para encontrar processos que impedem o Mac de entrar em repousopmset -g thermlogexibe informações de processos com throttling, servindo de referência ao executar benchmarkspmset displaysleepnowcoloca imediatamente apenas a tela em repouso, sem suspender o sistema inteiropmset sleepnowcoloca imediatamente todo o sistema em repouso
-
taskpolicy- Controle de escalonamento de processostaskpolicy -b <command>executa o comando fornecido em segundo plano e, em Macs com Apple silicon, ele roda apenas nos núcleos de eficiênciataskpolicy -b -p <pid>rebaixa um processo existente para execução em segundo planotaskpolicy -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> | pbcopycopia a saída do comando para a área de transferênciapbpasteenvia o conteúdo da área de transferência para a saída padrão
-
open- Abrir arquivos e aplicativosopen -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 Finderopen -R <file>mostra o arquivo especificado em uma nova janela do Finder
-
screencapture- Capturar screenshotsscreencapture -ctira uma captura de tela e a copia para a área de transferênciascreencapture <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 falasay <message>reproduz a mensagem fornecida em vozsay -f input.txt -o output.aiffcria um audiobook a partir do arquivo de texto especificado
Imagens, documentos, busca e metadados
-
sips- Manipulação de imagenssips -z <height> <width> <image>redimensiona a imagem para o tamanho especificado, ignorando a proporção originalsips -Z <size> <image>ajusta o lado mais longo para o tamanho especificado, preservando a proporçãosips -c <height> <width> <image>faz um crop no tamanho especificado, tomando como referência o centro da imagem originalsips -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 documentotextutilconsegue converter arquivos entre formatos Microsoft Word, texto simples, rich text e HTMLtextutil -convert html journal.docconvertejournal.docemjournal.html- Os valores que podem ser usados com
-convertsãotxt,html,rtf,rtfd,docedocx
-
mdfind,mdls- Busca do Spotlight e metadadosmdfind <query>realiza uma busca por palavra-chave no Spotlight com a consulta fornecidamdfind kMDItemAppStoreHasReceipt=1encontra todos os apps instalados pela Mac App Storemdfind -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 internetnetworkQualityexecuta um teste de velocidade da internet no Mac- Ao adicionar a flag
-v, é possível ver informações mais detalhadas - A flag
-Iexecuta o teste em uma interface de rede específica
-
networksetup- Verificação e configuração de ajustes de redenetworksetup -listnetworkserviceorderimprime a lista de serviços de rede disponíveisnetworksetup -getinfo <networkservice>mostra informações do serviço de rede especificadonetworksetup -getdnsservers <networkservice>imprime os servidores DNS do serviço de rede especificadonetworksetup -setairportnetwork <device> <network> [password]conecta à rede Wi‑Fi especificada- Na maioria dos casos, o argumento
<device>é"en0"
-
softwareupdate- Gerenciamento de atualizações do SOsoftwareupdate --listimprime as atualizações de software disponíveissudo softwareupdate -iainstala todas as atualizações disponíveissoftwareupdate --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_profilerimprime 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 especificadosystem_profiler -listDataTypesmostra 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 atualsystem_profiler SPSoftwareDataType: imprime o resumo de software do Mac atual e o número exato da versão do macOSsystem_profiler SPPowerDataType: imprime informações de energia e bateria, incluindo a potência atual em AC e a contagem de ciclos da bateriasystem_profiler SPDeveloperToolsDataType: imprime as ferramentas de desenvolvimento do Xcode atualmente ativas e as versões dos SDKs
- Por padrão,
5 comentários
Comandos de terminal avançados do MacBook que ajudam na vida (para usuários comuns)
https://www.youtube.com/watch?v=EhiqpFtmjig
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
Acho até melhor assim, porque mesmo resumindo nesse nível que você fez, dá para entender sem dificuldade haha
Não é bem assim... haha
Comentários do Hacker News
Com sips e iconutil juntos, dá para criar um arquivo
.icnspara app a partir de um único PNG 1024×1024 sem ferramentas de terceirosCrie o iconset com
mkdir MyIcon.iconset, gere os tamanhos 16/32/128/256/512 e os arquivos@2xcomsips -ze depois executeiconutil -c icns MyIcon.iconsetDe bônus, também dá para criar um
.icocomffmpeg -i MyIcon.iconset/icon_256x256.png icon.icoSó fico na dúvida, por causa da forma como o
sipsreduz 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 pxcpdá para usar qlmanage primeiro para criar um PNG 1024×1024qlmanage -t -s 1024x1024 -o MyIcon.iconset/Icon1024.png icon.svgMas, 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ênciapbpaste | something | pbcopy, vale a pena transformar isso em função de shellDá para usar como
pbfilter json_pp,pbfilter base64 -d,pbfilter sed 's/this/that/'Se você executar apenas
pbfiltersem argumentos, ele também pode funcionar como um filtro para remover a formatação da área de transferência e deixar só texto puroSó 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
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//;};}'"ealias 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'No X11 existe
xclip[0], no Wayland existewl-clipboard[1], e eles também suportam formatos binários por meio de parsing de cabeçalhos ou definição explícita de tipos MIMEAssim, 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
osascriptpara chamar AppleScript e usarset the clipboard to...[0] https://github.com/astrand/xclip
[1] https://github.com/bugaevc/wl-clipboard
Se você copiar um texto no celular, pode trazê-lo direto para a linha de comando do Mac com
pbpastepbpaste | vipe | pbcopyAqui, 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
https://developer.apple.com/download/all/
https://tldp.org/HOWTO/Traffic-Control-HOWTO/components.html
Ela configura regras para injetar latência nos pacotes ou descartar uma certa porcentagem deles conforme o perfil
No macOS, com
dnctlepfctl, dá para fazer algo parecido — e até mais do que issoTambé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
saypara 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çãoO 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
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
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 0seguido dekillall Finder, eles somem, e se mudar o valor para1, voltam a aparecerTambém criei um alias bash para alternar isso, e o gist está em https://gist.github.com/berndverst/6f58c0d6aedddb6c06c23e57d...
Ainda assim, uso bastante
~/Desktop, então ela é uma das duas pastas que deixo no Dock; a outra é~/DownloadsPor 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
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 comoPC Execute, e depois capturá-la no Keyboard Maestro para remapeá-la de novohidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000035}]}', dá para trocar a teclaparagraphno canto superior esquerdo de um teclado europeu por uma crase muito mais útilhttps://hidutil-generator.netlify.app/
Por exemplo, você pode desmontar um drive USB com
hdiutil detach /Volumes/some-usb-driveou criar um ISO comhdiutil 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
pushque recebe um título e um corpo opcionalEra prático usar algo como
./longRunningCommand && push "Task Done" "Here is a body", e eu também o usava junto com um scriptbeepque só emitia um som quando eu estava na frente do computador para indicar a conclusãosayNunca 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
sayno notebook do cliente”Por isso, adicionei um script de conclusão de comando no fish que usa
afplaypara emitir um bip se a tarefa levou mais de 5 segundosIsso ajuda a retomar o foco em tarefas “longas o bastante para serem esquecidas”
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
diskutile encontrei a solução na thread a seguirhttps://apple.stackexchange.com/questions/411544/cant-reclai...
Agora posso voltar a usar o disco inteiro no macOS
diskutilé excelente, mas o estado atual do Disk Utility.app é lamentávelDepois da transição para APFS, ele claramente não recebeu manutenção adequada, e há casos em que o
diskutilfunciona mas o app GUI falha completamente em fazer a mesma coisaAntes 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 comocaffeinate -u -t 1800open é 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-nEla 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
open -a ...parece horrível há anos, porque a Apple não atualiza a definição de completionDeixei uma solução alternativa nesta resposta do Stack Overflow: https://stackoverflow.com/a/63097652
Você pode usar
/Applications/Sublime Merge.app/Contents/SharedSupport/bin/smergee/Applications/Sublime Text.app/Contents/SharedSupport/bin/sublhttps://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 editoralias finder='open .'