13 Punkte von GN⁺ 2023-06-28 | 5 Kommentare | Auf WhatsApp teilen
  • Allein mit dem Terminal lassen sich macOS-spezifische Funktionen wie Energiesparen, Zwischenablage, Finder, Spotlight und Updates steuern, wodurch sich wiederkehrende GUI-Aufgaben reduzieren lassen
  • caffeinate, pmset und taskpolicy beeinflussen das Systemverhalten direkt, etwa beim Verhindern des Ruhezustands, beim Prüfen des Energiezustands oder beim Anpassen der Ausführungspriorität von Prozessen
  • Mit pbcopy, pbpaste, open, screencapture und say lassen sich alltägliche Aufgaben wie Zwischenablage, Dateiend öffnen, Screenshots und Sprachausgabe leicht in Skripte einbauen
  • sips, textutil, mdfind und mdls dienen als Werkzeuge zur Dateiverarbeitung, um Bild- und Dokumentkonvertierung, Spotlight-basierte Suche und Metadatenprüfung zu automatisieren
  • networkQuality, networksetup, softwareupdate und system_profiler helfen dabei, Netzwerkqualität, Wi‑Fi/DNS, OS-Updates sowie Hardware- und Softwareinformationen schnell zu prüfen

Umfang macOS-spezifischer Befehle

  • macOS enthält neben den standardmäßigen Unix-Werkzeugen auch eigene Kommandozeilen-Tools, die Zugriff auf Betriebssystemfunktionen bieten
  • Die genaue Verwendung jedes Befehls lässt sich mit man <command> nachschlagen
  • Referenzumgebung ist macOS Sonoma

Energie, Ruhezustand und Prozesssteuerung

  • caffeinate - Verhindert, dass der Mac in den Ruhezustand wechselt

    • Wenn caffeinate ohne Flags oder Argumente ausgeführt wird, wechselt der Mac während der Laufzeit des Befehls nicht in den Ruhezustand
    • caffeinate -u -t <seconds> wendet den Schutz vor Ruhezustand für die angegebene Anzahl Sekunden an
    • Mit dem Flag -d wird zusätzlich verhindert, dass das Display in den Ruhezustand geht
    • Mit -w <pid> kann ein bestehender Prozess angegeben werden; caffeinate endet dann ebenfalls, sobald dieser Prozess beendet wird
    • caffeinate <command> startet den angegebenen Befehl als neuen Prozess und verhindert den Ruhezustand, bis dieser Prozess beendet ist
  • pmset - Energieverwaltungsstatus prüfen und steuern

    • pmset -g gibt verfügbare Energieeinstellungen aus
    • pmset -g assertions zeigt energiebezogene Assertions anderer Prozesse an und ist nützlich, um Prozesse zu finden, die den Mac am Ruhezustand hindern
    • pmset -g thermlog zeigt Informationen zu gedrosselten Prozessen an und kann beim Ausführen von Benchmarks hilfreich sein
    • pmset displaysleepnow versetzt nur das Display sofort in den Ruhezustand, ohne das gesamte System schlafen zu legen
    • pmset sleepnow versetzt das gesamte System sofort in den Ruhezustand
  • taskpolicy - Prozess-Scheduling steuern

    • taskpolicy -b <command> führt den angegebenen Befehl im Hintergrund aus; auf Apple-silicon-Macs läuft er dabei nur auf Effizienzkernen
    • taskpolicy -b -p <pid> stuft einen bestehenden Prozess auf Hintergrundausführung herab
    • taskpolicy -B -p <pid> entfernt den Hintergrundstatus des angegebenen Prozesses
      • Auf Apple-silicon-Macs kann er danach auf Effizienz- oder Performance-Kernen laufen
      • Dieses Verhalten gilt nur für Prozesse, die nachträglich in den Hintergrund versetzt wurden, nicht für Prozesse, die von Anfang an im Hintergrund gestartet wurden
    • taskpolicy -s <command> startet den angegebenen Befehl im angehaltenen Zustand, sodass sich zum Startzeitpunkt ein Debugger anhängen lässt

Zwischenablage, App-Start, Screenshots und Sprachausgabe

  • pbcopy, pbpaste - System-Zwischenablage verwenden

    • <command> | pbcopy kopiert die Ausgabe eines Befehls in die Zwischenablage
    • pbpaste gibt den Inhalt der Zwischenablage auf der Standardausgabe aus
  • open - Dateien und Anwendungen öffnen

    • open -a <app> <file> öffnet die angegebene Datei mit einer bestimmten Anwendung
    • Mit dem Flag -g wird die Datei im Hintergrund geöffnet, ohne den Fokus der aktuellen Anwendung zu ändern
    • open . öffnet das aktuelle Verzeichnis in einem neuen Finder-Fenster
    • open -R <file> zeigt die angegebene Datei in einem neuen Finder-Fenster an
  • screencapture - Screenshots aufnehmen

    • screencapture -c erstellt einen Screenshot und kopiert ihn in die Zwischenablage
    • screencapture <file> speichert einen Screenshot in der angegebenen Datei
    • Mit dem Flag -T <seconds> wird erst nach der angegebenen Anzahl Sekunden aufgenommen
  • say - Text in Sprache umwandeln

    • say <message> gibt die angegebene Nachricht per Sprache aus
    • say -f input.txt -o output.aiff erzeugt aus der angegebenen Textdatei ein Hörbuch

Bilder, Dokumente, Suche und Metadaten

  • sips - Bildbearbeitung

    • sips -z <height> <width> <image> skaliert ein Bild auf die angegebene Größe und ignoriert dabei das ursprüngliche Seitenverhältnis
    • sips -Z <size> <image> passt bei beibehaltenem Seitenverhältnis die längere Seite auf die angegebene Größe an
    • sips -c <height> <width> <image> beschneidet das Bild zentriert auf die angegebene Größe
    • sips -r <degrees> <image> dreht das Bild um den angegebenen Winkel
    • Standardmäßig wird das Eingabebild destruktiv überschrieben; wenn ein anderer Ausgabepfad benötigt wird, sollte das Flag -o verwendet werden
    • Die Ausgabedatei muss dieselbe Dateiendung wie das Eingabebild haben
  • textutil - Dokumentdateien konvertieren

    • textutil kann Dateien zwischen Microsoft Word, Plain Text, Rich Text und HTML konvertieren
    • textutil -convert html journal.doc konvertiert journal.doc in journal.html
    • Für -convert sind die Werte txt, html, rtf, rtfd, doc und docx möglich
  • mdfind, mdls - Spotlight-Suche und Metadaten

    • mdfind <query> führt eine Spotlight-Stichwortsuche mit der angegebenen Abfrage aus
    • mdfind kMDItemAppStoreHasReceipt=1 findet alle Apps, die über den Mac App Store installiert wurden
    • mdfind -name <name> sucht nach allen Dateien, deren Name dem angegebenen Wert entspricht
    • Mit dem Flag -onlyin <dir> lässt sich der Suchbereich auf ein bestimmtes Verzeichnis beschränken
    • mdls <file-path> gibt alle mit der angegebenen Datei verknüpften Spotlight-Metadaten aus

Netzwerk, Updates und Systeminformationen

  • networkQuality - Internetgeschwindigkeit messen

    • networkQuality führt auf dem Mac einen Internet-Geschwindigkeitstest aus
    • Mit dem Flag -v lassen sich ausführlichere Informationen anzeigen
    • Das Flag -I führt den Test auf einer bestimmten Netzwerkschnittstelle aus
  • networksetup - Netzwerkeinstellungen prüfen und konfigurieren

    • networksetup -listnetworkserviceorder gibt eine Liste der verfügbaren Netzwerkdienste aus
    • networksetup -getinfo <networkservice> zeigt Informationen zum angegebenen Netzwerkdienst an
    • networksetup -getdnsservers <networkservice> gibt die DNS-Server des angegebenen Netzwerkdienstes aus
    • networksetup -setairportnetwork <device> <network> [password] verbindet mit dem angegebenen Wi‑Fi-Netzwerk
    • In den meisten Fällen ist das Argument <device> "en0"
  • softwareupdate - OS-Updates verwalten

    • softwareupdate --list gibt verfügbare Software-Updates aus
    • sudo softwareupdate -ia installiert alle verfügbaren Updates
    • softwareupdate --fetch-full-installer --full-installer-version <version> versucht, das vollständige Installationsprogramm der angegebenen macOS-Version nach /Applications herunterzuladen
  • system_profiler - Systeminformationen abfragen

    • system_profiler gibt standardmäßig alle verfügbaren Systeminformationen aus; die Ausgabemenge ist meist sehr groß
    • system_profiler <datatype> gibt nur Informationen zum angegebenen Teilsystem aus
    • system_profiler -listDataTypes zeigt alle Teilsysteme an, für die Informationen abgerufen werden können
    • Nützliche Datentypen sind unter anderem
      • system_profiler SPHardwareDataType: gibt die aktuelle Hardware-Übersicht des Macs, den Modellnamen und die Seriennummer aus
      • system_profiler SPSoftwareDataType: gibt die aktuelle Software-Übersicht des Macs und die genaue macOS-Versionsnummer aus
      • system_profiler SPPowerDataType: gibt Energie- und Batterieinformationen aus, einschließlich aktueller AC-Leistung und Batterieladezyklen
      • system_profiler SPDeveloperToolsDataType: gibt die aktuell aktivierten Xcode-Entwicklungswerkzeuge und SDK-Versionen aus

5 Kommentare

 
dansepo 2023-07-07

Nützliche fortgeschrittene Terminal-Befehle für das MacBook (für normale Nutzer)
https://www.youtube.com/watch?v=EhiqpFtmjig

 
xguru 2023-06-28

Fortgeschrittene CLI-Befehle unter macOS

Ich habe denselben Artikel vor 7 Monaten schon einmal zusammengefasst und gepostet, aber diese Zusammenfassung hier ist sehenswerter.. schnief

 
edunga1 2023-06-28

Ich finde es sogar besser, weil man es problemlos versteht, selbst wenn man es ungefähr auf das von Ihnen zusammengefasste Maß kürzt, haha

 
botplaysdice 2023-06-28

Nein, stimmt nicht ... haha

 
GN⁺ 2023-06-28
Hacker-News-Kommentare
  • Mit sips und iconutil zusammen kann man aus einer einzigen 1024×1024-PNG-Datei eine .icns-Datei für Apps erstellen, ganz ohne Third-Party-Tools
    Mit mkdir MyIcon.iconset erstellt man das Icon-Set, erzeugt dann mit sips -z die Größen 16/32/128/256/512 sowie die @2x-Dateien und führt anschließend iconutil -c icns MyIcon.iconset aus
    Als Bonus kann man mit ffmpeg -i MyIcon.iconset/icon_256x256.png icon.ico auch eine .ico-Datei erzeugen
    Allerdings frage ich mich, ob es wegen der Art, wie sips PNGs herunterskaliert, besser ist, die 16px-Version direkt aus 1024px zu erzeugen oder sie schrittweise von 32px herunterzuskalieren

    • Wenn die Ausgangsdatei ein SVG ist, kann man statt cp zuerst qlmanage verwenden, um eine 1024×1024-PNG-Datei zu erzeugen
      qlmanage -t -s 1024x1024 -o MyIcon.iconset/Icon1024.png icon.svg
    • Wenn man wirklich gut aussehende kleine Icons möchte, besonders 16×16 oder 32×32, muss man sie nach dem Verkleinern von Hand nachbearbeiten, damit sie scharf wirken
      Wenn man sich allerdings die System-Icons von macOS ansieht, scheint das heute nicht mehr von Hand gemacht zu werden
  • Aus der Liste mag ich besonders pbcopy und pbpaste
    Wenn ich mit komprimiertem JSON arbeite, wechsle ich in iTerm und führe pbpaste | json_pp | pbcopy aus; dann landet die formatierte Ausgabe im Clipboard, was sehr praktisch ist

    • Da ich das Muster pbpaste | something | pbcopy oft benutze, lohnt es sich, dafür eine Shell-Funktion anzulegen
      Man kann sie dann etwa als pbfilter json_pp, pbfilter base64 -d oder pbfilter sed 's/this/that/' verwenden
      Führt man einfach nur pbfilter ohne Argumente aus, kann es auch als Filter dienen, der die Formatierung aus dem Clipboard entfernt und nur reinen Text übrig lässt
      Allerdings funktioniert das nicht mit Aliases, Pipelines oder komplexen Ausdrücken; der Filterbefehl muss ein normaler Befehl oder eine Funktion samt Argumenten sein
    • Dieser Ablauf ist eine leistungsstarke und elegante Art, Textprobleme zu lösen
      Doppelte Leerzeilen, wie sie etwa durch Windows-artiges Copy-and-Paste entstehen, lassen sich zum Beispiel mit alias winlines="sed '/^$/{$!{N;s/\n//;};}'" und alias pbw="pbpaste | winlines | pbcopy" bereinigen
      Auch unter Linux kann man macOS-ähnliches Verhalten mit alias pbcopy='xsel --clipboard --input', alias pbpaste='xsel --clipboard --output' nachbilden
    • Dass diese nur mit Plain Text und RTF funktionieren, ist ziemlich lästig
      Für X11 gibt es xclip[0], für Wayland wl-clipboard[1], und beide unterstützen über Header-Parsing oder explizites Setzen von MIME-Typen auch binäre Dateiformate
      Dadurch kann man im Terminal Bilder kopieren und in GUI-Programme wie Browser oder Chat-Clients einfügen oder umgekehrt, und das ist auch für Shell-Skripte zur Desktop-Automatisierung nützlich
      Unter macOS braucht man dafür als Umweg osascript, um AppleScript aufzurufen und set the clipboard to... zu verwenden
      [0] https://github.com/astrand/xclip
      [1] https://github.com/bugaevc/wl-clipboard
    • Es ist auch cool, pbcopy/pbpaste zusammen mit dem Handy zu verwenden
      Wenn man auf dem Handy Text kopiert, kann man ihn auf der Mac-Kommandozeile direkt mit pbpaste abrufen
    • Wenn ich den Inhalt des Clipboards bearbeiten will, verwende ich pbpaste | vipe | pbcopy
      vipe ist dabei ein Utility, das mitten in eine Pipe einen Editor, normalerweise vim, einschleift, und ist unter https://joeyh.name/code/moreutils/ zu finden
  • Kein Kommandozeilen-Tool, aber Network Link Conditioner ist ebenfalls richtig gut
    Man kann damit Latenz, Bandbreite, Paketverlust und Ähnliches einfügen, um ein wirklich schlechtes Netzwerk zu simulieren, was für Tests nützlich ist
    Sogar in Meetings, in denen die Kamera unbedingt eingeschaltet sein soll, kann man die Verbindung absichtlich ruinieren, sodass blockiges Video und Roboterstimme auftreten, und wenn dann alle bitten, das Video auszuschalten, wird alles „wie durch Magie“ wieder normal

    • Comcast erledigt unter macOS, BSD und Linux dasselbe und hat außerdem einen großartigen Namen
    • Toxiproxy ist ein ähnliches Tool für andere Umgebungen und hat dabei geholfen, Netzwerk-Code unter schlechten Bedingungen wie Timeouts, Retries und Paketverlust zu testen und zu verbessern
    • Ich wusste nicht, dass es solche Tools gibt, und auch im Paket „additional tools for X-Code“ gibt es noch mehr coole Tools, die ich nicht kannte
      https://developer.apple.com/download/all/
    • Unter Linux kann man mit Netzwerk-QoS-Tools auf sehr fortgeschrittene Weise Ähnliches erreichen
      https://tldp.org/HOWTO/Traffic-Control-HOWTO/components.html
    • NLC ist eine GUI-Oberfläche zur Steuerung von dummynet und PF(packet filter)
      Sie setzt je nach Profil Regeln, die Paketverzögerung einfügen oder einen bestimmten Anteil an Paketen verwerfen
      Unter macOS kann man mit dnctl und pfctl ähnliche Dinge tun, und noch mehr darüber hinaus
  • afplay für die Audiowiedergabe muss man ebenfalls unbedingt erwähnen
    Damit lässt sich einfach ein MP3-Player für die Kommandozeile bauen
    Es gibt auch das say-Utility zur Sprachsynthese, das das TUNE-Format unterstützt, sodass man die gesamte Melodie und das Timing einer Äußerung steuern und sie so klingen lassen kann, als stecke Emotion darin
    Apples Speech Synthesis Programming Guide gibt es unter https://josh8.com/blog/img/speech-synthesis.pdf, und ein passender Artikel ist hier zusammengefasst: https://josh8.com/blog/commandline-audio-mac.html

    • Leider war das TUNE-Format evolutionär gesehen fast eine Sackgasse
      Die letzte Generation der Sprachsynthese, die es unterstützte, war die 2007 eingeführte Stimme Alex, und es ist sehr unwahrscheinlich, dass wir so etwas noch einmal sehen werden
      Feingranulare Kontrolle über die Synthese und Natürlichkeit stehen grundsätzlich in einem Spannungsverhältnis, und Letztere ist deutlich wertvoller
    • Kleine Korrektur: Der Befehl zum Anzeigen der Stimmenliste ist say -v '?'
  • Wenn ich produktiver sein will oder eine Präsentation halte, blende ich alle Symbole und Ordner auf dem Desktop aus
    Mit defaults write com.apple.finder CreateDesktop 0 und anschließend killall Finder werden sie ausgeblendet, mit dem Wert 1 wieder eingeblendet
    Ich habe mir dafür auch einen Bash-Alias gebaut; das Gist ist hier: https://gist.github.com/berndverst/6f58c0d6aedddb6c06c23e57d...

    • Eines der ersten Dinge, die ich beim Einrichten eines neuen Mac mache, ist den Desktop abzuschalten
      Trotzdem nutze ich ~/Desktop häufig, deshalb ist es einer der zwei Ordner in meinem Dock; der andere ist ~/Downloads
      Andererseits war es großartig, dass macOS Stacks auf dem Desktop eingeführt hat, und ich zeige diese Funktion immer Leuten, deren Desktop im Dateichaos versinkt
    • Ich nutze diese Methode seit über 10 Jahren und habe sie, als ich Lehrer war, sogar einer Tastenkombination zugewiesen
      Es lohnt sich, sie mit anderen Einstellungen zu bündeln, die in Präsentationssituationen nützlich sein können
  • Gute Liste, und es gibt auch hidutil
    https://developer.apple.com/library/archive/technotes/tn2450...
    Man kann zum Beispiel auf einer PC-Tastatur die unter macOS fast nutzlose Ins-Taste auf etwas wie PC Execute umlegen und sie dann in Keyboard Maestro abfangen und erneut zuordnen

    • Mit hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000035}]}' kann man bei einer europäischen Tastatur die paragraph-Taste links oben in eine nützlichere Backtick-Taste verwandeln
    • Es gibt einen brauchbaren Generator, der solche Mappings erstellt
      https://hidutil-generator.netlify.app/
    • hidutil und hdiutil darf man nicht verwechseln
      Mit hdiutil detach /Volumes/some-usb-drive kann man zum Beispiel ein USB-Laufwerk aushängen oder mit hdiutil makehybrid -joliet -o foo.iso ./srcfolder/ ein ISO erzeugen
  • Vor ein paar Jahren habe ich beim Schreiben eines Skripts, das in einem großen Datenblock nach etwas suchte und nach Abschluss Bescheid geben sollte, am Ende den Befehl say eingebaut
    Dann habe ich das vergessen und bin eingeschlafen, nur um ein paar Stunden später im Homeoffice durch eine Stimme hochzuschrecken, die klang, als würde ein „Eindringling“ mit einem Komplizen sprechen; erst als ich begriff, was los war, war ich sehr erleichtert

    • Für einige Benachrichtigungen nutze ich Pushover, deshalb habe ich vor einiger Zeit ein kleines Bash-Skript namens push geschrieben, das einen Titel und optional einen Textkörper entgegennimmt
      Es war praktisch für Dinge wie ./longRunningCommand && push "Task Done" "Here is a body", und wenn ich am Rechner saß, habe ich es auch zusammen mit einem beep-Skript verwendet, das nur einen Ton zur Abschlussmeldung abspielte
    • Für solche Zwecke nehme ich gern das research complete-Sample aus StarCraft
    • Ähnlich dazu gibt es auch ein Metasploit-Modul, das nach einer Kompromittierung auf einem Mac den Befehl say ausführt
      Ich habe das in freier Wildbahn noch nie gesehen, aber ich hoffe auf einen zukünftigen Twitter-Thread, der mit „Ich habe ein msf-Modul benutzt, das auf dem Laptop des Kunden say aufgerufen hat“ beginnt
    • Wenn man viele Terminal-Tabs offen hat, startet man leicht einen lang laufenden Befehl, wechselt in einen anderen Tab und vergisst ihn dann
      Deshalb habe ich ein Fish-Skript für den Abschluss von Befehlen hinzugefügt, das mit afplay einen Piepton abspielt, wenn die Aufgabe länger als 5 Sekunden gedauert hat
      Das hilft dabei, die Konzentration bei Aufgaben wiederzufinden, die „gerade lang genug dauern, um sie zu vergessen“
    • Wenn man die Stimme auf Arnold umstellen könnte, würde ich ziemlich viel Geld dafür bezahlen
  • Das Kommandozeilen-Utility diskutil unter macOS verdient ebenfalls Lob
    Heute hatte ich ein Problem mit einem bestimmten Slice auf der Festplatte, das sich mit dem grafischen Festplattendienstprogramm von macOS nicht beheben ließ; es war ein Überbleibsel von früheren Experimenten mit Asahi Linux
    Ich dachte mir, dass sich das wahrscheinlich mit der diskutil-CLI lösen ließe, und habe im folgenden Thread die Lösung gefunden
    https://apple.stackexchange.com/questions/411544/cant-reclai...
    Jetzt kann ich die gesamte Platte wieder vollständig unter macOS nutzen

    • diskutil ist großartig, aber dass Disk Utility.app in diesen Zustand geraten ist, ist unerquicklich
      Seit der Umstellung auf APFS wurde es nicht ordentlich gepflegt, und es gibt Fälle, in denen diskutil funktioniert, die GUI-App aber vollständig scheitert
      Vor dem Redesign der Oberfläche war es ein robustes Werkzeug, das einem zumindest sagte, warum etwas fehlgeschlagen ist; jetzt ist es zu einer LEGO-Duplo-Oberfläche für Kleinkinder verkommen, die gerade noch so einen USB-Stick formatieren kann
  • Wenn man sich nicht an einen Befehl oder Parameter erinnern kann, lohnt sich auch ein Blick auf um
    https://github.com/promptops/cli
    Wenn man zum Beispiel um prevent my mac from sleeping for 30m eingibt, erhält man ein Ergebnis wie caffeinate -u -t 1800

  • open ist ein einfacher, guter Befehl, den ich ständig benutze
    Ich habe mir etwa alias tab='open . -a iterm', alias phpstorm='open -a "PhpStorm"' und alias smerge='open -a "Sublime Merge"' angelegt und nutze sie häufiger als die Open-/Recents-Dialoge der jeweiligen Apps

    • Bei open -a ... fühlt sich die Tab-Autovervollständigung seit Jahren furchtbar an, weil Apple die Completion-Definition nicht aktualisiert
      Ich habe in dieser Stack-Overflow-Antwort einen Workaround hinterlassen: https://stackoverflow.com/a/63097652
    • Unter den nicht erwähnten Flags gibt es auch -n
      Damit lässt sich dieselbe Anwendung in mehreren Instanzen starten; früher war das für mich persönlich eines der meistgenutzten Utilities
      Heute nutze ich es seltener, weil es weniger Apps mit derart gravierenden Designproblemen gibt
    • Sublime Text und Sublime Merge bringen standardmäßig CLI-Utilities mit und haben zusätzliche Funktionen
      Man kann /Applications/Sublime Merge.app/Contents/SharedSupport/bin/smerge und /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl verwenden
    • Ich habe ein Skript erstellt, um Dateien mit rofi zu öffnen
      https://github.com/davatorium/rofi
      Es sieht so aus: https://i.imgur.com/Hm9TGeV.jpg
      Im VS-Code-Terminal öffnet es mit dem Alias o vom aktuellen Ort aus, und dort kann man Dateien suchen und sie im Editor öffnen
    • Um aus dem aktuellen Verzeichnis im Terminal ein neues Finder-Fenster zu öffnen, kann man alias finder='open .' verwenden