13 puntos por GN⁺ 2023-06-28 | 5 comentarios | Compartir por WhatsApp
  • Solo con la Terminal se pueden manejar funciones propias de macOS como ahorro de energía, portapapeles, Finder, Spotlight y actualizaciones, reduciendo tareas repetitivas en la GUI
  • caffeinate, pmset y taskpolicy influyen directamente en el comportamiento del sistema, como evitar el reposo, revisar el estado de energía y ajustar la prioridad de ejecución de procesos
  • Con pbcopy, pbpaste, open, screencapture y say, es fácil incorporar en scripts tareas cotidianas como usar el portapapeles, abrir archivos, tomar capturas de pantalla y generar salida de voz
  • sips, textutil, mdfind y mdls se usan como herramientas de procesamiento de archivos para automatizar conversiones de imágenes y documentos, búsquedas basadas en Spotlight y revisión de metadatos
  • networkQuality, networksetup, softwareupdate y system_profiler permiten revisar rápidamente la calidad de red, Wi‑Fi/DNS, actualizaciones del sistema operativo e información de hardware y software

Alcance de los comandos exclusivos de macOS

  • Además de las herramientas Unix estándar, macOS incluye herramientas de línea de comandos dedicadas para acceder a funciones del sistema operativo
  • El uso detallado de cada comando puede consultarse con man <command>
  • El entorno de referencia es macOS Sonoma

Energía, reposo y control de procesos

  • caffeinate - Evitar que la Mac entre en reposo

    • Si se ejecuta caffeinate sin flags ni argumentos, la Mac no entrará en reposo mientras el comando esté en ejecución
    • caffeinate -u -t <seconds> aplica la prevención de reposo durante la cantidad de segundos especificada
    • Si se agrega el flag -d, también evita que la pantalla entre en reposo
    • Con -w <pid> se especifica un proceso existente, y caffeinate también termina cuando ese proceso finaliza
    • caffeinate <command> inicia el comando dado como un nuevo proceso y evita el reposo hasta que ese proceso termine
  • pmset - Consultar y controlar el estado de administración de energía

    • pmset -g muestra la información de configuración de energía disponible
    • pmset -g assertions muestra las assertions relacionadas con energía creadas por otros procesos, útil para encontrar procesos que impiden que la Mac entre en reposo
    • pmset -g thermlog muestra información de procesos con throttling, útil como referencia al ejecutar benchmarks
    • pmset displaysleepnow pone inmediatamente en reposo solo la pantalla, sin suspender todo el sistema
    • pmset sleepnow pone inmediatamente en reposo todo el sistema
  • taskpolicy - Control de scheduling de procesos

    • taskpolicy -b <command> ejecuta el comando dado en segundo plano y, en Macs con Apple silicon, solo se ejecuta en los núcleos de eficiencia
    • taskpolicy -b -p <pid> reduce un proceso existente a ejecución en segundo plano
    • taskpolicy -B -p <pid> elimina el estado de ejecución en segundo plano del proceso especificado
      • En Macs con Apple silicon, después de esto puede ejecutarse en núcleos de eficiencia o de rendimiento
      • Este comportamiento solo se aplica a procesos que fueron reducidos a segundo plano, no a procesos iniciados en segundo plano desde el principio
    • taskpolicy -s <command> inicia el comando dado en estado suspendido, lo que permite adjuntar un depurador en el momento en que comienza la ejecución

Portapapeles, apertura de apps, capturas de pantalla y salida de voz

  • pbcopy, pbpaste - Usar el portapapeles del sistema

    • <command> | pbcopy copia el resultado de salida del comando al portapapeles
    • pbpaste envía el contenido del portapapeles a la salida estándar
  • open - Abrir archivos y aplicaciones

    • open -a <app> <file> abre el archivo especificado con una aplicación concreta
    • Si se agrega el flag -g, abre el archivo en segundo plano manteniendo el foco en la aplicación actual
    • open . abre el directorio actual en una nueva ventana de Finder
    • open -R <file> muestra el archivo especificado en una nueva ventana de Finder
  • screencapture - Tomar capturas de pantalla

    • screencapture -c toma una captura de pantalla y la copia al portapapeles
    • screencapture <file> guarda la captura de pantalla en el archivo especificado
    • Si se agrega el flag -T <seconds>, espera la cantidad de segundos indicada antes de capturar
  • say - Conversión de texto a voz

    • say <message> reproduce el mensaje dado como voz
    • say -f input.txt -o output.aiff genera un audiolibro a partir del archivo de texto especificado

Imágenes, documentos, búsqueda y metadatos

  • sips - Manipulación de imágenes

    • sips -z <height> <width> <image> redimensiona la imagen al tamaño indicado, ignorando la relación de aspecto original
    • sips -Z <size> <image> ajusta el lado más largo al tamaño especificado manteniendo la relación de aspecto
    • sips -c <height> <width> <image> hace un recorte al tamaño indicado tomando como referencia el centro de la imagen original
    • sips -r <degrees> <image> rota la imagen la cantidad de grados especificada
    • El comportamiento predeterminado sobrescribe destructivamente la imagen de entrada, por lo que se debe usar el flag -o si se necesita otra ruta de salida
    • El archivo de salida debe tener la misma extensión que la imagen de entrada
  • textutil - Conversión de archivos de documentos

    • textutil puede convertir archivos entre formatos Microsoft Word, texto plano, texto enriquecido y HTML
    • textutil -convert html journal.doc convierte journal.doc en journal.html
    • Los valores que se pueden usar con -convert son txt, html, rtf, rtfd, doc y docx
  • mdfind, mdls - Búsqueda de Spotlight y metadatos

    • mdfind <query> realiza una búsqueda por palabras clave de Spotlight con la consulta dada
    • mdfind kMDItemAppStoreHasReceipt=1 encuentra todas las apps instaladas desde la Mac App Store
    • mdfind -name <name> busca todos los archivos que coincidan con el nombre especificado
    • Con el flag -onlyin <dir> se puede limitar el alcance de la búsqueda a un directorio concreto
    • mdls <file-path> muestra todos los metadatos de Spotlight asociados al archivo especificado

Red, actualizaciones e información del sistema

  • networkQuality - Medición de velocidad de internet

    • networkQuality ejecuta una prueba de velocidad de internet en la Mac
    • Si se agrega el flag -v, se puede ver información más detallada
    • El flag -I ejecuta la prueba en una interfaz de red específica
  • networksetup - Consultar y configurar ajustes de red

    • networksetup -listnetworkserviceorder muestra la lista de servicios de red disponibles
    • networksetup -getinfo <networkservice> muestra la información del servicio de red especificado
    • networksetup -getdnsservers <networkservice> muestra los servidores DNS del servicio de red especificado
    • networksetup -setairportnetwork <device> <network> [password] se conecta a la red Wi‑Fi especificada
    • En la mayoría de los casos, el argumento <device> es "en0"
  • softwareupdate - Administrar actualizaciones del sistema operativo

    • softwareupdate --list muestra las actualizaciones de software disponibles
    • sudo softwareupdate -ia instala todas las actualizaciones disponibles
    • softwareupdate --fetch-full-installer --full-installer-version <version> intenta descargar en /Applications el instalador completo de la versión de macOS especificada
  • system_profiler - Consultar información del sistema

    • system_profiler muestra de forma predeterminada toda la información del sistema disponible, y la salida suele ser bastante extensa
    • system_profiler <datatype> muestra solo la información del subsistema especificado
    • system_profiler -listDataTypes muestra la lista de todos los subsistemas de los que se puede obtener información
    • Algunos tipos de datos útiles son los siguientes
      • system_profiler SPHardwareDataType: muestra un resumen del hardware de la Mac actual, el nombre del modelo y el número de serie
      • system_profiler SPSoftwareDataType: muestra un resumen del software de la Mac actual y el número exacto de versión de macOS
      • system_profiler SPPowerDataType: muestra información de energía y batería, incluida la potencia AC actual y el número de ciclos de la batería
      • system_profiler SPDeveloperToolsDataType: muestra las herramientas de desarrollo de Xcode actualmente activas y las versiones del SDK

5 comentarios

 
dansepo 2023-07-07

Comandos avanzados de Terminal para MacBook que te ayudan en la vida (para usuarios comunes)
https://www.youtube.com/watch?v=EhiqpFtmjig

 
xguru 2023-06-28

Comandos avanzados de CLI en macOS

Yo había subido un resumen del mismo artículo hace 7 meses, pero este resumen está mejor para leerlo.. T_T

 
edunga1 2023-06-28

Mejor así, creo; incluso reduciéndolo más o menos a lo que resumiste se entiende sin problema jaja

 
botplaysdice 2023-06-28

No es así...... jaja

 
GN⁺ 2023-06-28
Comentarios de Hacker News
  • Si usas sips y iconutil juntos, puedes crear un archivo .icns para una app a partir de un solo PNG de 1024×1024 sin herramientas de terceros
    Crea el iconset con mkdir MyIcon.iconset, genera los tamaños 16/32/128/256/512 y los archivos @2x con sips -z, y luego ejecuta iconutil -c icns MyIcon.iconset
    Como extra, también puedes crear un .ico con ffmpeg -i MyIcon.iconset/icon_256x256.png icon.ico
    Aunque queda la duda de si, por la forma en que sips reduce PNG, conviene más generar la versión de 16px directamente desde 1024px o ir reduciendo gradualmente desde 32px

    • Si el archivo inicial es un SVG, primero puedes usar qlmanage en lugar de cp para crear un PNG de 1024×1024
      qlmanage -t -s 1024x1024 -o MyIcon.iconset/Icon1024.png icon.svg
    • Si de verdad quieres íconos pequeños que se vean muy bien, especialmente de 16×16 o 32×32, hay que reducirlos y luego retocarlos a mano para que queden nítidos
      Aunque al revisar los íconos del sistema de macOS, parece que hoy en día ya no están ajustados a mano
  • De la lista, me gustan especialmente pbcopy y pbpaste
    Cuando trabajo con JSON comprimido, voy a iTerm y ejecuto pbpaste | json_pp | pbcopy; así la salida formateada queda en el portapapeles y es comodísimo

    • Como uso seguido el patrón pbpaste | something | pbcopy, vale la pena convertirlo en una función de shell
      Se puede usar como pbfilter json_pp, pbfilter base64 -d, pbfilter sed 's/this/that/'
      Si ejecutas pbfilter sin argumentos, también puede funcionar como un filtro para quitar el formato del portapapeles y dejar solo texto plano
      Eso sí, no sirve para alias, pipelines ni expresiones complejas; el comando del filtro tiene que ser un comando normal o función con sus argumentos
    • Este flujo es una forma potente y elegante de resolver problemas de texto
      Por ejemplo, las dobles líneas en blanco que aparecen al copiar/pegar estilo Windows se pueden limpiar con alias winlines="sed '/^$/{$!{N;s/\n//;};}'" y alias pbw="pbpaste | winlines | pbcopy"
      En Linux también se puede imitar algo parecido a macOS con alias pbcopy='xsel --clipboard --input' y alias pbpaste='xsel --clipboard --output'
    • Es bastante molesto que estas herramientas solo funcionen con texto plano y RTF
      En X11 está xclip[0] y en Wayland wl-clipboard[1], que también soportan formatos binarios mediante parsing de headers o configuración explícita de tipos MIME
      Así puedes copiar imágenes desde la terminal y pegarlas en programas GUI como un navegador o un cliente de chat, o hacer lo contrario, y también sirven para scripts de automatización de escritorio
      En macOS hace falta recurrir a AppleScript vía osascript y usar set the clipboard to...
      [0] https://github.com/astrand/xclip
      [1] https://github.com/bugaevc/wl-clipboard
    • También está genial usar pbcopy/pbpaste junto con el teléfono
      Si copias texto en el teléfono, puedes traerlo enseguida a la línea de comandos de la Mac con pbpaste
    • Para editar el contenido del portapapeles, uso pbpaste | vipe | pbcopy
      Aquí vipe es una utilidad que inserta un editor, normalmente vim, en medio de un pipe, y se puede ver en https://joeyh.name/code/moreutils/
  • No es una herramienta de línea de comandos, pero Network Link Conditioner también es excelente
    Te permite simular una red muy mala añadiendo latencia, ancho de banda limitado, pérdida de paquetes y más, así que es muy útil para pruebas
    Incluso en reuniones donde insisten en que enciendas la cámara, puedes arruinar a propósito la conexión para que se vea video pixelado y voz robótica, y cuando todos te pidan apagar el video, “mágicamente” todo vuelve a la normalidad

    • Comcast también hace lo mismo en macOS, BSD y Linux, y además tiene un nombre brillante
    • Toxiproxy es una herramienta parecida para otros entornos, y ha ayudado a probar y mejorar código de red bajo condiciones malas como timeouts, reintentos y pérdida de paquetes
    • No sabía que existían herramientas así, y tampoco sabía que en el paquete “additional tools for X-Code” hay más herramientas geniales que no conocía
      https://developer.apple.com/download/all/
    • En Linux se puede hacer algo parecido, y hasta más pro, con herramientas de QoS de red
      https://tldp.org/HOWTO/Traffic-Control-HOWTO/components.html
    • NLC es una interfaz gráfica para controlar dummynet y PF(packet filter)
      Configura reglas para inyectar latencia de paquetes o descartar cierto porcentaje de paquetes según el perfil
      En macOS, con dnctl y pfctl puedes hacer algo similar, e incluso más
  • También hay que mencionar afplay para reproducir audio
    Con esto se puede armar un reproductor MP3 sencillo desde la línea de comandos
    También está la utilidad say para síntesis de voz, que soporta el formato TUNE, así que se puede ajustar la melodía y el timing completos de la locución y hacer que suene como si tuviera emoción
    La guía Apple Speech Synthesis Programming Guide está en https://josh8.com/blog/img/speech-synthesis.pdf y el artículo relacionado está resumido en https://josh8.com/blog/commandline-audio-mac.html

    • Lamentablemente, el formato TUNE terminó siendo casi un callejón sin salida evolutivo
      La última generación de síntesis de voz que lo soportó fue la voz Alex incluida en 2007, y parece muy poco probable que volvamos a verla
      El control preciso de la síntesis y la naturalidad están esencialmente en tensión, y esta última vale mucho más
    • Una pequeña corrección: el comando para ver la lista de voces es say -v '?'
  • Cuando quiero ser más productivo o voy a dar una presentación, oculto todos los íconos y carpetas del escritorio
    Si ejecutas defaults write com.apple.finder CreateDesktop 0 y luego killall Finder, se ocultan; si cambias el valor a 1, vuelven a aparecer
    También me hice un alias de bash para alternarlo, y el gist está en https://gist.github.com/berndverst/6f58c0d6aedddb6c06c23e57d...

    • Una de las primeras cosas que hago al configurar una Mac nueva es desactivar el escritorio
      Aun así uso mucho ~/Desktop, así que es una de las dos carpetas que dejo en el Dock; la otra es ~/Downloads
      Por otro lado, fue excelente que llegaran los Stacks al escritorio de macOS, y siempre se lo muestro a la gente que tiene el escritorio hecho un caos de archivos
    • Llevo usando este método más de 10 años, y cuando era profesor hasta le asigné una combinación de teclas
      Conviene agruparlo con otras configuraciones que puedan servir en una presentación
  • Buena lista, y también está hidutil
    https://developer.apple.com/library/archive/technotes/tn2450...
    Por ejemplo, en un teclado de PC puedes cambiar la tecla Ins, que en macOS casi no sirve para nada, por algo como PC Execute, y luego capturarla en Keyboard Maestro para volver a mapearla

    • Con hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000035}]}' puedes cambiar la tecla paragraph de la esquina superior izquierda de un teclado europeo por una backtick más útil
    • Hay un generador bastante bueno para crear estos mapeos
      https://hidutil-generator.netlify.app/
    • No hay que confundir hidutil con hdiutil
      Por ejemplo, con hdiutil detach /Volumes/some-usb-drive puedes desmontar una unidad USB, o con hdiutil makehybrid -joliet -o foo.iso ./srcfolder/ puedes crear una ISO
  • Hace unos años, mientras hacía un script para buscar algo en un gran bloque de datos y avisarme cuando terminara, le puse al final el comando say
    Me olvidé de eso y me quedé dormido, y unas horas después me desperté de golpe al oír en la oficina de mi casa una voz que sonaba como “un intruso” hablándole a su cómplice; recién cuando entendí qué pasaba me tranquilicé muchísimo

    • Como uso Pushover para algunas alertas, hace tiempo hice un pequeño script de bash llamado push que recibe un título y un cuerpo opcional
      Era cómodo usarlo como ./longRunningCommand && push "Task Done" "Here is a body", y también lo usaba junto con un script beep que solo emitía un sonido para avisar que había terminado cuando yo estaba frente a la computadora
    • Para esto me gusta usar la muestra research complete de StarCraft
    • De forma parecida, también hay un módulo de Metasploit que hace ejecutar el comando say en una Mac después de comprometerla
      Nunca he visto que alguien lo use de verdad, pero algún día espero ver un hilo de Twitter que empiece con “usé un módulo de msf que llamaba a say en la laptop del cliente”
    • Si tienes varias pestañas del terminal abiertas, es fácil lanzar un comando que tarda mucho, irte a otra pestaña y olvidarte de él
      Por eso agregué un script de finalización de comandos en fish que hace sonar un bip con afplay si la tarea tardó más de 5 segundos
      Ayuda a volver a concentrarse en tareas “justo lo bastante largas como para olvidarlas”
    • Pagaría bastante dinero si se pudiera cambiar la voz por la de Arnold
  • La utilidad de línea de comandos diskutil de macOS también merece elogios
    Hoy tuve un problema con algunos slices del disco, y la utilidad gráfica Disk Utility de macOS no podía arreglarlo; eran restos de cuando estuve probando Asahi Linux
    Pensé que tenía que haber una forma de resolverlo con la CLI de diskutil, y encontré la solución en el siguiente hilo
    https://apple.stackexchange.com/questions/411544/cant-reclai...
    Ahora puedo volver a usar todo el disco desde macOS

    • diskutil es excelente, pero es desolador en lo que se convirtió Disk Utility.app
      Desde la transición a APFS no ha recibido un mantenimiento adecuado, y hay casos en los que diskutil puede hacer algo que la app GUI simplemente no logra
      Antes del rediseño de la interfaz era una herramienta sólida que al menos te decía por qué había fallado, pero ahora parece una interfaz tipo LEGO Duplo para bebés que apenas alcanza para formatear una memoria USB
  • Cuando no recuerdas un comando o parámetro, también vale la pena probar um
    https://github.com/promptops/cli
    Por ejemplo, si escribes um prevent my mac from sleeping for 30m, te devuelve algo como caffeinate -u -t 1800

  • open es un comando simple y bueno que uso siempre
    alias tab='open . -a iterm', alias phpstorm='open -a "PhpStorm"', alias smerge='open -a "Sublime Merge"'; los dejo configurados así y los uso más seguido que los cuadros de diálogo Open/Recents de cada app

    • Entre los flags no mencionados también está -n
      Te permite ejecutar múltiples instancias de la misma aplicación, y antes era, en lo personal, una de las utilidades que más usaba
      Hoy la uso menos porque ya hay menos apps con problemas de diseño tan graves
    • El autocompletado con Tab de open -a ... se siente horrible desde hace años porque Apple no actualiza la definición de completado
      Dejé una solución alternativa en esta respuesta de Stack Overflow: https://stackoverflow.com/a/63097652
    • Sublime Text y Sublime Merge incluyen utilidades de CLI por defecto, y además tienen funciones extra
      Puedes usar /Applications/Sublime Merge.app/Contents/SharedSupport/bin/smerge y /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl
    • Hice un script para abrir archivos con rofi
      https://github.com/davatorium/rofi
      Se ve como https://i.imgur.com/Hm9TGeV.jpg
      En la terminal de VS Code, si usas el alias o, se abre en la ubicación actual y desde ahí puedes buscar archivos para abrirlos en el editor
    • Para abrir una nueva ventana de Finder en el directorio actual de la terminal, basta con usar alias finder='open .'