13 points par GN⁺ 2023-06-28 | 5 commentaires | Partager sur WhatsApp
  • Il est possible de gérer des fonctions propres à macOS comme la mise en veille, le presse-papiers, Finder, Spotlight ou les mises à jour uniquement depuis le terminal, ce qui réduit les tâches répétitives dans l’interface graphique
  • caffeinate, pmset, taskpolicy agissent directement sur le comportement du système, par exemple pour empêcher la mise en veille, vérifier l’état de l’alimentation ou ajuster la priorité d’exécution des processus
  • Avec pbcopy, pbpaste, open, screencapture, say, il devient facile d’intégrer à des scripts des tâches du quotidien comme le presse-papiers, l’ouverture de fichiers, les captures d’écran ou la synthèse vocale
  • sips, textutil, mdfind, mdls servent d’outils de traitement de fichiers pour automatiser la conversion d’images et de documents, la recherche via Spotlight et la consultation des métadonnées
  • networkQuality, networksetup, softwareupdate, system_profiler permettent de vérifier rapidement la qualité du réseau, le Wi‑Fi/DNS, les mises à jour de l’OS et les informations matérielles et logicielles

Portée des commandes spécifiques à macOS

  • En plus des outils Unix standards, macOS inclut des outils en ligne de commande dédiés donnant accès à des fonctions du système d’exploitation
  • L’usage détaillé de chaque commande peut être consulté avec man <command>
  • L’environnement de référence est macOS Sonoma

Alimentation, veille et contrôle des processus

  • caffeinate - Empêcher le Mac de se mettre en veille

    • Exécuter caffeinate sans option ni argument empêche le Mac d’entrer en veille tant que la commande s’exécute
    • caffeinate -u -t <seconds> applique une prévention de mise en veille pendant le nombre de secondes indiqué
    • Ajouter l’option -d empêche aussi la mise en veille de l’écran
    • Avec -w <pid>, on cible un processus existant et caffeinate se termine quand ce processus s’arrête
    • caffeinate <command> lance la commande donnée dans un nouveau processus et empêche la mise en veille jusqu’à la fin de ce processus
  • pmset - Vérifier et contrôler l’état de la gestion d’alimentation

    • pmset -g affiche les informations de configuration de l’alimentation disponibles
    • pmset -g assertions montre les assertions liées à l’alimentation créées par d’autres processus, utile pour trouver ce qui empêche le Mac de se mettre en veille
    • pmset -g thermlog affiche les informations sur les processus soumis à throttling, pratique lors de benchmarks
    • pmset displaysleepnow met immédiatement l’écran en veille sans mettre tout le système en veille
    • pmset sleepnow met immédiatement tout le système en veille
  • taskpolicy - Contrôler l’ordonnancement des processus

    • taskpolicy -b <command> exécute la commande donnée en arrière-plan et, sur les Mac Apple silicon, uniquement sur les cœurs d’efficacité
    • taskpolicy -b -p <pid> rétrograde un processus existant en exécution d’arrière-plan
    • taskpolicy -B -p <pid> supprime l’état d’exécution en arrière-plan du processus indiqué
      • Sur les Mac Apple silicon, il pourra ensuite s’exécuter sur des cœurs d’efficacité ou de performance
      • Ce comportement ne s’applique qu’aux processus rétrogradés en arrière-plan, pas à ceux lancés en arrière-plan dès le départ
    • taskpolicy -s <command> démarre la commande donnée en état suspendu, ce qui permet d’attacher un débogueur au lancement

Presse-papiers, lancement d’apps, captures d’écran et synthèse vocale

  • pbcopy, pbpaste - Utiliser le presse-papiers système

    • <command> | pbcopy copie la sortie d’une commande dans le presse-papiers
    • pbpaste envoie le contenu du presse-papiers vers la sortie standard
  • open - Ouvrir des fichiers et des applications

    • open -a <app> <file> ouvre le fichier indiqué avec une application précise
    • Ajouter l’option -g permet d’ouvrir le fichier en arrière-plan tout en conservant le focus sur l’application actuelle
    • open . ouvre le répertoire courant dans une nouvelle fenêtre Finder
    • open -R <file> révèle le fichier indiqué dans une nouvelle fenêtre Finder
  • screencapture - Prendre des captures d’écran

    • screencapture -c prend une capture d’écran et la copie dans le presse-papiers
    • screencapture <file> enregistre la capture dans le fichier indiqué
    • Ajouter l’option -T <seconds> attend le nombre de secondes indiqué avant de capturer
  • say - Synthèse vocale

    • say <message> lit à voix haute le message fourni
    • say -f input.txt -o output.aiff génère un livre audio à partir du fichier texte indiqué

Images, documents, recherche et métadonnées

  • sips - Manipulation d’images

    • sips -z <height> <width> <image> redimensionne l’image à la taille indiquée sans respecter les proportions d’origine
    • sips -Z <size> <image> ajuste le côté le plus long à la taille indiquée tout en conservant les proportions
    • sips -c <height> <width> <image> rogne l’image à la taille indiquée en se basant sur le centre de l’image source
    • sips -r <degrees> <image> fait pivoter l’image de l’angle indiqué
    • Par défaut, l’outil écrase le fichier source de manière destructive, donc il faut utiliser l’option -o si l’on veut un chemin de sortie différent
    • Le fichier de sortie doit avoir la même extension que l’image d’entrée
  • textutil - Conversion de documents

    • textutil peut convertir des fichiers entre les formats Microsoft Word, texte brut, texte enrichi et HTML
    • textutil -convert html journal.doc convertit journal.doc en journal.html
    • Les valeurs acceptées par -convert sont txt, html, rtf, rtfd, doc, docx
  • mdfind, mdls - Recherche Spotlight et métadonnées

    • mdfind <query> exécute une recherche par mots-clés Spotlight avec la requête fournie
    • mdfind kMDItemAppStoreHasReceipt=1 trouve toutes les applications installées depuis le Mac App Store
    • mdfind -name <name> recherche tous les fichiers correspondant au nom indiqué
    • L’option -onlyin <dir> permet de limiter la recherche à un répertoire précis
    • mdls <file-path> affiche toutes les métadonnées Spotlight associées au fichier indiqué

Réseau, mises à jour et informations système

  • networkQuality - Mesurer la vitesse Internet

    • networkQuality exécute un test de débit Internet sur le Mac
    • Ajouter l’option -v permet d’obtenir des informations plus détaillées
    • L’option -I lance le test sur une interface réseau spécifique
  • networksetup - Vérifier et configurer les paramètres réseau

    • networksetup -listnetworkserviceorder affiche la liste des services réseau disponibles
    • networksetup -getinfo <networkservice> affiche les informations du service réseau indiqué
    • networksetup -getdnsservers <networkservice> affiche les serveurs DNS du service réseau indiqué
    • networksetup -setairportnetwork <device> <network> [password] se connecte au réseau Wi‑Fi indiqué
    • Dans la plupart des cas, l’argument <device> est "en0"
  • softwareupdate - Gérer les mises à jour de l’OS

    • softwareupdate --list affiche les mises à jour logicielles disponibles
    • sudo softwareupdate -ia installe toutes les mises à jour disponibles
    • softwareupdate --fetch-full-installer --full-installer-version <version> tente de télécharger dans /Applications le programme d’installation complet de la version macOS indiquée
  • system_profiler - Consulter les informations système

    • system_profiler affiche par défaut toutes les informations système disponibles, avec un volume de sortie généralement important
    • system_profiler <datatype> n’affiche que les informations du sous-système indiqué
    • system_profiler -listDataTypes montre la liste de tous les sous-systèmes dont les informations peuvent être récupérées
    • Types de données utiles :
      • system_profiler SPHardwareDataType : affiche l’aperçu matériel du Mac actuel, le nom du modèle et le numéro de série
      • system_profiler SPSoftwareDataType : affiche l’aperçu logiciel du Mac actuel et le numéro de version exact de macOS
      • system_profiler SPPowerDataType : affiche les informations d’alimentation et de batterie, y compris la puissance secteur actuelle et le nombre de cycles de la batterie
      • system_profiler SPDeveloperToolsDataType : affiche les outils de développement Xcode actuellement actifs et les versions des SDK

5 commentaires

 
dansepo 2023-07-07

Des commandes Terminal avancées sur MacBook qui peuvent vous être utiles (pour le grand public)
https://www.youtube.com/watch?v=EhiqpFtmjig

 
xguru 2023-06-28

J’avais publié il y a 7 mois un résumé du même article : Commandes CLI avancées de macOS

mais ce résumé-ci vaut davantage le détour.. T_T

 
edunga1 2023-06-28

Je trouve ça même mieux, sans doute parce qu’il n’y a aucun mal à comprendre même en le réduisant à peu près au niveau de votre résumé, haha.

 
botplaysdice 2023-06-28

Pas du tout...... haha

 
GN⁺ 2023-06-28
Commentaires Hacker News
  • En combinant sips et iconutil, on peut créer un fichier .icns pour une app à partir d’un seul PNG 1024×1024, sans outil tiers
    Il suffit de créer un jeu d’icônes avec mkdir MyIcon.iconset, de générer les tailles 16/32/128/256/512 ainsi que les fichiers @2x avec sips -z, puis d’exécuter iconutil -c icns MyIcon.iconset
    Bonus : on peut aussi créer un .ico avec ffmpeg -i MyIcon.iconset/icon_256x256.png icon.ico
    En revanche, je me demande si, vu la façon dont sips réduit les PNG, il vaut mieux générer la version 16 px directement depuis le 1024 px, ou la réduire progressivement à partir du 32 px

    • Si le fichier de départ est un SVG, on peut d’abord utiliser qlmanage au lieu de cp pour produire un PNG 1024×1024
      qlmanage -t -s 1024x1024 -o MyIcon.iconset/Icon1024.png icon.svg
    • Si l’on veut de très belles petites icônes, surtout en 16×16 ou 32×32, il faut les retoucher à la main après réduction pour qu’elles restent nettes
      Cela dit, en regardant les icônes système de macOS, on dirait qu’elles ne sont plus vraiment ajustées à la main de nos jours
  • Dans cette liste, j’aime particulièrement pbcopy et pbpaste
    Quand je manipule du JSON compacté, c’est très pratique d’ouvrir iTerm et d’exécuter pbpaste | json_pp | pbcopy pour récupérer une sortie mise en forme dans le presse-papiers

    • J’utilise si souvent le motif pbpaste | something | pbcopy que ça vaudrait le coup d’en faire une fonction shell
      On pourrait l’utiliser comme pbfilter json_pp, pbfilter base64 -d, pbfilter sed 's/this/that/'
      Si on lance simplement pbfilter sans argument, il peut aussi servir de filtre pour enlever toute mise en forme du presse-papiers et ne garder que le texte brut
      En revanche, ça ne marche pas avec les alias, les pipelines ou les expressions complexes : la commande de filtre doit être une commande normale ou une fonction, avec ses arguments
    • Ce flux est une façon puissante et élégante de résoudre des problèmes de texte
      Par exemple, les doubles lignes vides générées par le copier-coller façon Windows peuvent être nettoyées avec alias winlines="sed '/^$/{$!{N;s/\n//;};}'" et alias pbw="pbpaste | winlines | pbcopy"
      Sous Linux, on peut imiter le comportement de macOS avec alias pbcopy='xsel --clipboard --input' et alias pbpaste='xsel --clipboard --output'
    • Le fait que cela ne fonctionne qu’avec le texte brut et le RTF est assez agaçant
      Sur X11, il y a xclip[0], et sur Wayland, wl-clipboard[1], qui prennent aussi en charge les formats de fichiers binaires grâce à l’analyse des en-têtes ou à la définition explicite des types MIME
      Il est donc possible de copier des images depuis le terminal pour les coller dans des applications GUI comme un navigateur ou un client de chat, ou de faire l’inverse, ce qui est aussi utile pour des scripts shell d’automatisation du bureau
      Sur macOS, il faut passer par osascript pour appeler AppleScript et utiliser set the clipboard to...
      [0] https://github.com/astrand/xclip
      [1] https://github.com/bugaevc/wl-clipboard
    • Utiliser pbcopy/pbpaste avec un téléphone, c’est aussi très pratique
      Si l’on copie du texte sur son téléphone, on peut ensuite le récupérer directement avec pbpaste depuis la ligne de commande du Mac
    • Pour modifier le contenu du presse-papiers, j’utilise pbpaste | vipe | pbcopy
      Ici, vipe est un utilitaire qui insère un éditeur, généralement vim, au milieu d’un pipeline, et on peut le voir sur https://joeyh.name/code/moreutils/
  • Ce n’est pas un outil en ligne de commande, mais Network Link Conditioner est lui aussi excellent
    Il permet de simuler un très mauvais réseau en ajoutant de la latence, des limites de bande passante, des pertes de paquets, etc., ce qui est utile pour les tests
    Lors de réunions où l’on vous demande absolument d’activer la caméra, on peut aussi dégrader volontairement sa connexion pour afficher une vidéo pixelisée et une voix de robot, puis la voir redevenir « magiquement » normale quand tout le monde demande de couper la vidéo

    • Comcast fait la même chose sur macOS, BSD et Linux, et son nom est excellent
    • Toxiproxy est un outil similaire utilisable dans d’autres environnements, et il m’a aidé à tester et améliorer du code réseau dans des conditions dégradées comme les timeouts, les retries ou la perte de paquets
    • Je ne savais pas que ce type d’outil existait, et il y a aussi d’autres outils intéressants que je ne connaissais pas dans le paquet « additional tools for X-Code »
      https://developer.apple.com/download/all/
    • Sous Linux, on peut faire quelque chose de semblable en mode expert avec les outils QoS réseau
      https://tldp.org/HOWTO/Traffic-Control-HOWTO/components.html
    • NLC est une interface GUI qui pilote dummynet et PF(packet filter)
      Elle configure des règles qui injectent de la latence sur les paquets ou en suppriment un certain pourcentage selon le profil
      Sur macOS, on peut faire des choses similaires, voire davantage, avec dnctl et pfctl
  • Il faut aussi absolument mentionner afplay pour la lecture audio
    On peut s’en servir pour fabriquer facilement un lecteur MP3 en ligne de commande
    Il y a aussi l’utilitaire say pour la synthèse vocale, qui prend en charge le format TUNE, ce qui permet d’ajuster la mélodie complète et le timing d’une élocution pour lui donner un rendu plus expressif
    Le Speech Synthesis Programming Guide d’Apple se trouve ici : https://josh8.com/blog/img/speech-synthesis.pdf, et un article connexe est résumé ici : https://josh8.com/blog/commandline-audio-mac.html

    • Malheureusement, le format TUNE a été à peu près une impasse évolutive
      La dernière génération de synthèse vocale à l’avoir pris en charge était la voix Alex incluse en 2007, et il semble très peu probable qu’on le revoie un jour
      Le contrôle fin de la synthèse et le naturel sont fondamentalement en tension, et le second a bien plus de valeur
    • Petite correction : la commande pour afficher la liste des voix est say -v '?'
  • Pour gagner en productivité ou faire une présentation, je masque toutes les icônes et tous les dossiers du bureau
    En lançant defaults write com.apple.finder CreateDesktop 0 puis killall Finder, ils disparaissent, et en remettant la valeur à 1, ils réapparaissent
    J’en ai même fait un alias bash pour basculer entre les deux, et le gist est ici : https://gist.github.com/berndverst/6f58c0d6aedddb6c06c23e57d...

    • C’est l’une des toutes premières choses que je fais quand je configure un nouveau Mac : désactiver le bureau
      Pourtant, j’utilise souvent ~/Desktop, au point que c’est l’un des deux dossiers que je garde dans le Dock, l’autre étant ~/Downloads
      Cela dit, l’arrivée des Stacks sur le bureau de macOS a été excellente, et c’est une fonction que je montre toujours aux gens dont le bureau est envahi de fichiers
    • J’utilise cette méthode depuis plus de 10 ans, et quand j’étais enseignant, je l’avais même assignée à un raccourci clavier
      C’est pratique de la regrouper avec d’autres réglages utiles en contexte de présentation
  • Bonne liste, et il y a aussi hidutil
    https://developer.apple.com/library/archive/technotes/tn2450...
    Par exemple, sur un clavier PC, on peut remapper la touche Ins, presque inutile sur macOS, en quelque chose comme PC Execute, puis la faire intercepter par Keyboard Maestro pour la remapper à nouveau

    • Avec hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000035}]}', on peut transformer la touche paragraph en haut à gauche d’un clavier européen en un backtick plus utile
    • Il existe un générateur correct pour créer ce genre de mappages
      https://hidutil-generator.netlify.app/
    • Il ne faut pas confondre hidutil et hdiutil
      Par exemple, on peut détacher un lecteur USB avec hdiutil detach /Volumes/some-usb-drive, ou créer un ISO avec hdiutil makehybrid -joliet -o foo.iso ./srcfolder/
  • Il y a quelques années, j’avais ajouté une commande say à la fin d’un script qui cherchait quelque chose dans un gros bloc de données et devait me prévenir une fois terminé
    J’avais oublié ce détail et je me suis endormi ; quelques heures plus tard, je me suis réveillé d’un bond en entendant dans mon bureau à domicile une voix qui ressemblait à celle d’un “intrus” parlant à son complice, et je n’ai été vraiment rassuré qu’après avoir compris ce qui se passait

    • J’utilise Pushover pour certaines notifications, donc j’avais écrit il y a longtemps un petit script bash appelé push qui prend un titre et un corps facultatif
      C’était pratique à utiliser comme ./longRunningCommand && push "Task Done" "Here is a body", et je l’employais aussi avec un script beep qui se contentait de faire un son de fin quand j’étais devant l’ordinateur
    • Pour ce genre d’usage, j’aime bien utiliser le sample research complete de StarCraft
    • Dans le même genre, il existe aussi un module Metasploit qui exécute la commande say sur un Mac après compromission
      Je n’en ai jamais vu d’usage réel, mais j’attends toujours le jour où apparaîtra un thread Twitter commençant par : « j’ai utilisé un module msf qui appelait say sur le portable d’un client »
    • Quand on garde plusieurs onglets de terminal ouverts, il est facile de lancer une commande longue, de passer sur un autre onglet, puis de l’oublier
      J’ai donc ajouté un script fish de fin de commande qui joue un bip avec afplay si la tâche a pris plus de 5 secondes
      Ça aide à se reconcentrer sur les tâches « juste assez longues pour être oubliées »
    • Je paierais volontiers assez cher si on pouvait changer la voix pour celle d’Arnold
  • L’utilitaire en ligne de commande diskutil de macOS mérite aussi des éloges
    Aujourd’hui, j’avais un problème avec certaines tranches de disque, que l’utilitaire graphique Disk Utility de macOS ne pouvait pas corriger ; c’était un reste d’anciens essais avec Asahi Linux
    Je me suis dit qu’il devait y avoir un moyen de le résoudre avec la CLI diskutil, et j’ai trouvé la solution dans le fil suivant
    https://apple.stackexchange.com/questions/411544/cant-reclai...
    Je peux maintenant réutiliser tout le disque sous macOS

    • diskutil est excellent, mais l’état actuel de Disk Utility.app est navrant
      Depuis le passage à APFS, l’application a visiblement été délaissée, et il arrive que la GUI échoue complètement sur des opérations que diskutil réussit
      Avant la refonte de l’interface, c’était un outil solide qui, même en cas d’échec, expliquait pourquoi ; aujourd’hui, c’est devenu une interface façon LEGO Duplo pour bébés, à peine bonne à formater une clé USB
  • Quand on ne se souvient plus d’une commande ou de ses paramètres, um vaut aussi le détour
    https://github.com/promptops/cli
    Par exemple, si on saisit um prevent my mac from sleeping for 30m, il renvoie quelque chose comme caffeinate -u -t 1800

  • open est une commande simple et excellente que j’utilise en permanence
    alias tab='open . -a iterm', alias phpstorm='open -a "PhpStorm"', alias smerge='open -a "Sublime Merge"' par exemple ; je m’en sers plus souvent que des boîtes de dialogue Open/Recents de chaque application

    • Parmi les points faibles de open -a ..., l’autocomplétion par tabulation est atroce depuis des années parce qu’Apple ne met pas à jour sa définition de complétion
      J’ai laissé une solution de contournement dans cette réponse Stack Overflow : https://stackoverflow.com/a/63097652
    • Parmi les options non mentionnées, il y a aussi -n
      Elle permet de lancer plusieurs instances de la même application, et c’était autrefois l’un de mes utilitaires les plus utilisés
      Aujourd’hui, je m’en sers moins souvent, car il y a moins d’apps avec des problèmes de conception à ce point graves
    • Sublime Text et Sublime Merge fournissent par défaut des utilitaires CLI, avec des fonctions supplémentaires
      On peut utiliser /Applications/Sublime Merge.app/Contents/SharedSupport/bin/smerge et /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl
    • J’ai créé un script pour ouvrir des fichiers avec rofi
      https://github.com/davatorium/rofi
      Ça ressemble à https://i.imgur.com/Hm9TGeV.jpg
      Dans le terminal de VS Code, en utilisant l’alias o, ça s’ouvre à l’emplacement courant, puis on peut y chercher un fichier et l’ouvrir dans l’éditeur
    • Pour ouvrir une nouvelle fenêtre Finder dans le répertoire courant du terminal, il suffit d’utiliser alias finder='open .'