Useful built-in macOS command-line utilities

(weiyen.net)

535 points | by yen223 13 hours ago ago

127 comments

  • daneel_w 2 hours ago

    A couple more:

        afconvert(1) - an audio file format converter, which includes Apple's superior AAC codec from the Core Audio framework
    
        diskutil(8) - tons of tools for fixed and removable storage
    
    Examples:

        afconvert in.wav -o out.m4a -q 127 -s 2 -b 160000 -f m4af -d 'aac '
    
        mb=300; diskutil eraseVolume APFS myramdisk `hdiutil attach -nomount ram://$((mb*2048))`
    • jghn an hour ago

      > afconvert

      Oh wow! A while back I ripped some concert audio from Youtube, but it was too large for me to sync using my `iTunes Match`. I've been too lazy to figure out how to downsample it juuuuust enough. But it looks like this works right out of the box

    • hk1337 22 minutes ago

      How does that compare with ffmpeg? The arguments seem about the same.

  • antononcube 5 hours ago

    I would like to also recommend the app:

       hear (macOS speech recognition and dictation via the command line)
    
    See: https://sveinbjorn.org/hear

    (Uses built-in macOS capabilities for transcription from audio to text.)

    • xpe 4 hours ago

      Its open source GitHub repo at https://github.com/sveinbjornt/hear

      Man page at https://sveinbjorn.org/files/manpages/hear.1.html

      > (Uses built-in macOS capabilities for transcription from audio to text.)

      Question (to self, currently researching)... Which capabilities? Released when? I ask because Apple Intelligence has expanded the use of audio transcription features.

      Answer: `hear` uses SFSpeechRecognizer [1] which has been available since macOS 10.15. I'm not yet sure how it relates to Apple Intelligence transcription services.

      Note: "speech recognition is a network-based service" which perhaps suggests Apple Intelligence (the marketing term, not an Apple Developer term, I don't think) uses it as well

      [1][ https://developer.apple.com/documentation/speech/sfspeechrec...

    • e40 4 hours ago

      I thought I recognized the name of the developer! The person that brought us Platypus! Nice.

    • hk1337 20 minutes ago

      > which hear

      > hear not found

      macOS 15.1

  • vbezhenar 10 hours ago

    Few additions.

    open -n file.pdf : opens new instance of Preview application which is useful if you want to open the same file twice (for example to look at different pages at once).

    caffeinate -d : prevents display turning off, useful if you want to look at display without moving mouse.

    • 1ncorrect 6 hours ago

      I use this all the time:

      open -a <GUI Application> <File>

      Handy for distinguishing between editing and consuming media.

    • hk1337 3 hours ago

      open -a "Finder" . - open Finder in the current directory.

      Standard apps usually just need the name, like Finder and Safari but you can also specify the path "/Applications/DifferentFinder.app"

      • ilyagr 8 minutes ago

        You can also `open -R file` to select that file in Finder.

      • ssttoo 2 hours ago

        `open .` works for me too

        • hk1337 2 hours ago

          Yeah, I scrolled a bit and noticed that. Never thought about using just that.

      • nextos an hour ago

        Finder is pretty good, and it's handy to be able to open it from the terminal. But I find it super annoying it litters everything with .DS_Store files and there is no way to turn that off, except for external and network drives. Aside from, obviously, using a different file manager. Very un-Apple.

      • fragmede an hour ago

        you can just

            open .
        
        unless you've reconfigured something else to open directories, which most people haven't.
    • wwader 10 hours ago

      open -a is nice, i use it with alias, ex:

        alias qt='open -a "quicktime player"'
        alias vlc='open -a "vlc"'
      • FabHK 2 hours ago

        At least for me (I've installed vlc via homebrew), there is a vlc binary in the PATH, and I can just vlc <filename>

        • qrios a few seconds ago

          The point here is to open a document with an app not assigned as default for the given mime-type by file name extension.

    • alsetmusic 4 hours ago

      Also, `cd .` to open the current directory in a Finder window.

      Not mine (found online years ago), but here's the opposite. `cd` into the frontmost Finder window:

        cd "$(osascript -e 'tell app "Finder" to POSIX path of (insertion location as alias)')";
      • kps 4 hours ago

        You mean `open .`

      • sneak 2 hours ago

        You can also just drag the proxy icon onto the terminal window for its path, ie “cd “ <drop>, enter.

        • kstrauser an hour ago

          I use that all the time. You can also cmd-c copy a file in Finder then paste into the terminal to get its path.

    • mjs 8 hours ago

      Does `open` give focus? It used to, but since a few releases ago the app opens in the background, which is pretty annoying.

      My poor workaround is to use osascript: `tell application "System Events" to set frontmost of process "Finder" to true`

      • masswerk 6 hours ago

        Apparently, it does. There is a -g flag (background) to prevent focus.

    • troupo 8 hours ago

      `caffeinate -disu` is the best combination (that is, enable all options): your laptop won't go to sleep, won't dim the screem etc.

  • zitterbewegung 5 hours ago

    The terminal version of Disk Utility is actually much better than the GUI (it doesn't hang and the app is glitchy.

    Docs are at https://ss64.com/mac/diskutil.html

    • zazaulola 4 hours ago

      `pdisk` might be more convenient if you've worked with `gdisk` on ArchLinux

      https://manpagez.com/man/8/pdisk/

      • Tsiklon 2 hours ago

        If you have a modern Mac you have very little business using `pdisk`. It is only for editing disks mapped with an “Apple Partion Map”. This is obsolete replaced in practice by GPT on modern apple machines.

        • zazaulola 2 hours ago

          `gdisk` supports GPT, but to partition system SSD you need to deactivate System Integrity Protection:

              gdisk /dev/disk0
      • e40 3 hours ago

        diskutil does more than edit partitions, though.

    • e40 3 hours ago

      Or "man diskutil"

  • cglong 2 hours ago

    One-liner for previewing a file with Quick Look. I aliased this to `ql` :)

        qlmanage -p $argv >/dev/null 2>&1
    • hk1337 11 minutes ago

      I'm curious if there's a way to do this with standard input instead of having to supply a filename?

      I do this with man pages but it opens up in a full Preview window, not QuickLook.

  • doodpants 4 hours ago

    This article contains links to https://ss64.com/ , which is an amazing resource that I wish I'd known about sooner!

  • cantSpellSober 4 hours ago

    TinkerTool provides a GUI that runs some useful commands under the hood

    https://www.bresink.com/osx/0TinkerTool/download.php

  • mcc1ane 10 hours ago

    Related - https://news.ycombinator.com/item?id=36491704 "macOS command-line tools you might not know about"

  • nxobject 10 hours ago

    If you want the least useful macOS commandline utility, 'pdisk' is:

         "...a menu driven program which partitions disks using the standard
         Apple disk partitioning scheme described in "Inside Macintosh: Devices".
         It does not support the Intel/DOS partitioning scheme[.]"
  • zazaulola 3 hours ago

    It's probably been written about a lot of places already.

    For me, increasing the number of icons in the launcher grid was very useful.

    After running these three commands, the size of the Launcher will be set to 13x8 apps:

        defaults write com.apple.dock springboard-columns -int 13
        defaults write com.apple.dock springboard-rows -int 8
        defaults write com.apple.dock ResetLaunchPad -bool TRUE; killall Dock
    
    In general, a lot of parameters of different applications can be changed via command `defaults`

    https://macos-defaults.com/

    To get a complete list of parameters, you can execute

        defaults read
  • onnimonni 4 hours ago

    What I'm really missing still is a cli to iCloud stored passwords. AFAIK 'security' cli can't access the credentials stored in the cloud. This would be helpful to store secrets outside of git but would still allow scriptable access to them similarly as 1password cli 'op' has.

  • lagrange77 8 hours ago

    Not a command, but a little known feature of the Terminal app:

    (shift+command+K) or Menu 'Shell' -> 'New Remote Connection...'

    opens a SSH, S(FTP), TELNET connection manager window!

    • e40 3 hours ago

      Sort of like command+k in the Finder, connects to a server. You can type in vnc://host or vnc://localhost:port... the latter is for VNC to hosts via an SSH tunnel.

      It's quite a good VNC client, too.

    • FabHK 2 hours ago

      And sometimes handy: shift+cmd+. to toggle showing hidden (dot) files in Finder.

  • l33tman 8 hours ago

    As they seem to have removed Bluetooth Explorer and all ways to get diagnostic info about the bluetooth system and/or change codecs and settings, does anybody know any good cmdline ways in later mac osxes to do the same?

    For example I'm having a problem that comes and goes now and then where Bluetooth audio is 300 ms delayed compared to the video playback everywhere except in Youtube on Safari, very strange. It's good for a few months then suddenly it becomes unusable, then back to zero sync delay after a few months.

    I was thinking this might be related to CODEC selections etc or some hidden setting that might get changed which we normally aren't allowed to determine :)

    (btw I know there is a difference between latency and synchronization - latency might be unavoidable but video sync should always be able to compensate - I got curious on how exactly that works, where in the app / SDK / OS pipeline does the a/v sync happen on a Mac?)

  • zazaulola 5 hours ago

    To find what causes your laptop drains its battery, you can use

        sudo powermetrics
    • unsupp0rted 40 minutes ago

      I knew it! coreaudiod is using very high CPU at 111.90 ms/s

      I'm on a 16" M1 Macbook Pro 16 gig. Thanks Spotify.

  • __m 7 hours ago

    $ say Hello

    To scare your teammates when you are logged in remotely optionally with

    $ osascript -e "set volume output volume 100"

  • pseufaux 6 hours ago

    I'll add `plutil` to the list. It's great for reading plist files, but did you know it can parse json too?

    /usr/bin/plutil -extract your.key.path raw -o - - <<< "$jsoninput"

    (obviously, less useful now that `jq`is built in)

    • jonpalmisc 6 hours ago

          ; which jq
          /usr/bin/jq
          ; jq
          jq - commandline JSON processor [version 1.6-159-apple-gcff5336-dirty]
      
      Wow. When did `jq` start shipping by default? TIL
      • pseufaux an hour ago

        Starting in macOS 15, it was quietly included.

        Glad to spread the good word ;)

    • hk1337 3 hours ago

      > obviously, less useful now that `jq`is built in

      Hold up, what?

  • Bengalilol 6 hours ago

    There is also pmset which is very useful (since macOS doesn't give a UI counterpart) https://support.apple.com/en-am/guide/mac-help/mchl40376151/...

    • yen223 6 hours ago

      Oh this is pretty neat, thanks for sharing!

      https://ss64.com/mac/pmset.html

    • jftuga 5 hours ago

      I have this .zshrc function to track the battery and charging, which uses pmset:

          function batt-info() {
              echo
              system_profiler SPPowerDataType | grep Wattage | cut -c 7-
              echo
              pmset -g batt
          }
    • redman25 4 hours ago

      I've found reliably "turning on" with pmset to be hit or miss. I can't remember the gotcha I ran into if it was that you had to have your laptop lid open or something else...

  • jlv2 3 hours ago

    "I like to look at the list of macOS Bash commands."

    Sigh. These are shell commands, not "Bash commands".

    • alexvitkov 3 hours ago

      These are programs, not shell commands.

    • bowsamic 2 hours ago

      If you're going to correct someone snarkily, don't make a similar mistake...

    • awkward 2 hours ago

      Even calling them "zsh commands" would have been more accurate.

  • RandallBrown an hour ago

    A fun easter egg in the "say" command is that "OS X" is said as "Oh Ess Ten".

    You can also change voices with -v. My favorite is "cellos" since it sings to you.

    • staplung 24 minutes ago

      It actually understands roman numerals, to a certain extent. E.g. `say LVIII` will say "58". However, `say MCMLXXIX` speaks some gibberish that ends in the word "six", for some reason.

      It also knows how to say numbers up into the trillions but not more than that (although I feel like it used to).

    • robertoandred an hour ago

      Not sure that's an easter egg? That's been the pronunciation for 25 years.

      • mholm an hour ago

        It's at least manually programmed in. Otherwise it would have said 'Ecks'

  • 10729287 8 hours ago

    It misses the most important of them all, if you are used to copy content to usb drive for reading on a multimedia player : dot_clean -m

  • gkfasdfasdf 6 hours ago

    pbcopy and pbpaste are handy, for a version that works over ssh connections there is osc: https://github.com/theimpostor/osc

    • pak9rabid 2 hours ago

      At my job I have to work with a lot of JSON that's usually minimized. This command has single-handedly saved my sanity:

      $ pbpaste | jq | pbcopy

      Then I can paste it into whatever text editor I want and it's all nice & pretty-printed for me.

      Bonus is that I don't have to change the command at all, just copy the minimized JSON to the clipboard (say from DBeaver, for example), then hit the 'up' arrow and enter.

    • pmarreck 5 hours ago

      since I switch between linux and macos a lot I wrote a dotfile function called "clip" that will work the same on both. nice thing is it will automatically paste if nothing is piped to it to copy so there's no need to use separate commands... although I just realized it might be nice to have a "passthrough" mode that both copies and pastes if you add this to a pipeline in order to capture some intermediate part to the clipboard

          if [[ "$(uname)" == "Darwin" ]]; then
            clip() {
              [ -t 0 ] && pbpaste || pbcopy
            }
          else # assume linux if not macos
            clip() {
              [ -t 0 ] && xclip -o -selection clipboard || xclip -selection clipboard
            }
          fi
      • hk1337 a minute ago

        I went the route of managing a different set of dotfiles for linux and macOS. Same repository, just different branches.

        Also, falling back to using oh-my-zsh functionality.

      • gkfasdfasdf 5 hours ago

        That's handy, thanks! `osc copy` may also take args for files to copy to the clipboard, but in the absence of that and no data on stdin it maybe should switch to paste.

    • hk1337 3 hours ago

      I copied this functionality to linux it's been so useful.

  • huskyr 9 hours ago

    I've never heard of networkQuality, that's seems like quite a useful tool.

    • latexr 8 hours ago

      For reference, it’s been there since macOS 12. You may also like to know that this year (macOS 15) they added jq.

      • huskyr 3 hours ago

        I didn't know that, thanks!

    • dmd 5 hours ago

      Unfortunately, it's not actually very useful, as whatever server they're using on the other end is severely constrained. networkQuality gives me:

      Downlink: 884.856 Mbps, 198 RPM - Uplink: 13.238 Mbps, 198 RPM

      whereas speedtest (whether to the official speedtest server OR a friend's home server in their basement!) gives ~700 Mbps uplink.

      • lladnar an hour ago

        try

          networkQuality -s
        
        
        That's a more apples to apples comparison to speedtest.net; Separate upload and download tests.
  • xpe 4 hours ago

    My non-built-in CLI utility recommendations, none of which are macOS specific:

    * atuin - TUI for shell history, backed by SQLite - https://github.com/atuinsh/atuin

    * LSD (LSDeluxe) - rewrite of `ls` - https://github.com/lsd-rs/lsd

    * ripgrep - https://github.com/BurntSushi/ripgrep

    * fzf - command-line fuzzy finder that enhances file search, command history search, and more - https://github.com/junegunn/fzf

    Notes:

    - To get pretty extra file/folder symbols with LSD, you'll probably need to install some special fonts.

    - You can use `fzf` and `ripgrep` together.

    • yen223 3 hours ago

      I can vouch for fzf being a game-changer if you spend a lot of time in the CLI

      • kstrauser an hour ago

        My problem with fzf is that it's so broadly useful that I forget it exists.

  • noja 3 hours ago

    Does anyone remember the shortcut that brings up a list of currently available keyboard shortcuts for the current app? It may not be built-in, in which case it was a free utility.

  • trynumber9 10 hours ago
    • janandonly 9 hours ago

      I have thousands of old photos that preview can open, but I can’t upload them into the photo.app because the file format is wrong. I’m going to try and use SIPS to convert them all into png first and then add to photo.app. Thanks for this pointer.

      • FabHK 2 hours ago

        Similarly, I've had trouble getting audio files into a format that the Books app understands (for ebooks), until I found

           afconvert -v -s 3 -f m4bf filename.mp3
    • jftuga 4 hours ago

      Nice. After reading the man page, I see that it can be used to convert image file formats:

          sips -s format png photo.HEIC --out photo.png
      
      or resizing:

          sips -z 300 600 original.jpg --out new.jpg
    • yen223 5 hours ago

      sips looks really cool, thanks for pointing this out.

      Not gonna lie, I missed this because I thought it was related to macOS SIP, System Integrity Protection. Which is something I am deeply uninterested in.

  • llimllib 4 hours ago

    I maintain a more comprehensive list here: https://notes.billmill.org/computer_usage/mac_os/mac_os_comm...

    But I don’t have uuidgen!

  • chasil 3 hours ago

    Since Apple spent so much effort in getting certified:

    https://www.opengroup.org/openbrand/register/

    These are all guaranteed to work:

    https://pubs.opengroup.org/onlinepubs/9699919799/utilities/

    (I may not have linked to the precisely correct version.)

  • zikduruqe 4 hours ago

        locate 
    
    https://ss64.com/mac/locate.html

    locate searches a database for all pathnames which match the specified pattern. The database is recomputed periodically, (about once a week) and contains the path-names of all files which are publicly accessible.

    • emmelaich 3 hours ago

      The database is not set up by default.

      Your better bet on MacOS is to use `mdfind -name ....`

      • kstrauser an hour ago

        I have that aliased to `locate` on mine. It's not exactly the same but it gets me 99% of the way there.

  • extraduder_ire 5 hours ago

    Looks like a lot of these have linux equivalents that could be aliased. I wonder if anyone's made a set of those for regular macos users who occasionally use something else.

  • tzs 9 hours ago

    Here's a handy use I've found for mdfind.

    Say you've got a directory that has scripts or data files related to some thing you do. For example I've got several scripts that I use when I scan books with my book scanner. I only need these when doing book scanning stuff so don't want to put them somewhere in $PATH. I want to be able to easily run them from scripts that aren't in that directory, but I don't want to hard code the path to that directory.

    Solution: in the directory with the book scanning scripts I make a file named ID that contains a unique string. I currently use 16 byte random hex strings [1].

    I have this script, named find-dir-by-ID, somewhere in $PATH:

      #!/bin/zsh
      ID=${1:?Must specific ID}
      IDSHA=`echo $ID | shasum | cut -d ' ' -f 1`
      mdfind $ID 2>/dev/null | grep /ID | while read F; do
          FSHA=`shasum $F | cut -d ' ' -f 1`
          if [ $IDSHA = $FSHA ]; then
              dirname $F
              exit 0
          fi
      done
      exit 1
    
    If some script wants to use scripts from my book scanning script directory, it can do this:

      SCRIPT_DIR=`find-dir-by-ID 54f757919a5ede5961291bec27b15827`
      if [ ! -d $SCRIPT_DIR ]; then
        >&2 echo Cannot find book scanning scripts
        exit 1
      fi
    
    and then SCRIPT_DIR has the full path to the scanning script directory.

    The IDs do not have to be hex strings. If I'd thought about it more I probably would have made IDs look like this "book-scanning:54f757919a5ede59" or "arduino-tools:3b6b4f47bf803663".

    [1] here's a script for that:

      #!/bin/sh
      N=${1:-8} # number of bytes
      xxd -g $N -c $N -p -l $N < /dev/urandom
    • jeffhuys 9 hours ago

      Why not just a directory with subdirectories by ID? No mdfind needed, no problems with just-created directories, no wait, etc

      • tzs 8 hours ago

        You mean something like having ~/well-known-stuff and under that having a 54f757919a5ede5961291bec27b15827 directory with the book scanning scripts and so on?

        That could work fine, but generally the directories I've used this on are directories that I want to have somewhere else, and with a reasonable name. Usually the directories came first and various other things in fixed relative positions were using them, and then later I wanted to use them from elsewhere and added the ID.

        I suppose ~/well-known/stuff/54f757919a5ede5961291bec27b15827 could by a symbolic link to the original.

        The mdfind approach does have the advantage that if I reorganize things and move the directory it keeps working.

  • semanticist 10 hours ago

    Want to scan the local wifi networks from the command line, and get useful information like signal strength?

    /System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -s

    I set a shell alias so I can just do `airport -s`. I've no idea why this is hidden away inside some framework and not in a directory which is in the normal path, but there you go.

    • stunthamsterio 9 hours ago

      FWIW that appears to be soon deprecated according to MacOS 15.2:

      WARNING: The airport command line tool is deprecated and will be removed in a future release. For diagnosing Wi-Fi related issues, use the Wireless Diagnostics app or wdutil command line tool.

      • semanticist 8 hours ago

        Oh, that's a pity. I'm pretty bad at keeping up to date on MacOS releases, but I should probably start figuring out `wdutil` so that my muscle memory is adapted before I've got no choice!

  • BasilPH 2 hours ago

    I got this trick from someone on the Internet:

    $> long_running_command && say "Witness me, for I am done"

  • hk1337 3 hours ago

    plutil. Maybe not that useful to a lot of people but I have been going through and collecting bookmarks and Safari bookmarks are binary files. plutil is a means of converting the binary property file to a json or xml file.

    https://keith.github.io/xcode-man-pages/plutil.1.html

  • urbandw311er 10 hours ago

    Great tip about the `security` command, a new one for me.

  • jasomill 2 hours ago

    cliclick[1] is useful for gap-filling the AppleScript accessibility APIs when automating poorly-behaved applications.

    [1] https://github.com/BlueM/cliclick

  • Doctor_Fegg 9 hours ago

    fs_usage is my favourite - find out what's thrashing the disk. (Usually Spotlight or Spark...)

  • selectnull 10 hours ago

    TIL: caffeinate

    Very useful.

    • huskyr 9 hours ago

      For a GUI version, Amphetamine is quite nice (and free). https://apps.apple.com/us/app/amphetamine/id937984704?mt=12

      • neevans 9 hours ago

        yes amphetamine I use regularly when I want to charge my android phone during travel with lid closed.

        • walthamstow 7 hours ago

          That's interesting, I have never needed to do that. My Pixels have always just charged even if the lid is closed, on Intel and Apple Silicon machines. I like to travel light so I often use my laptop as a battery bank instead of carrying a seperate one.

    • vallode 9 hours ago

      Indeed, many applications I would expect to prevent sleeping (some audio playback ones, games, etc.) don't implement this. I assume it's a case of Apple's APIs changing over the years and not everyone catching up/caring. At one point I had downloaded Amphetamine[^1] but it is much nicer to just use the terminal here.

      [^1]: https://apps.apple.com/us/app/amphetamine/id937984704

    • al_borland 3 hours ago

      While it may avoid sleep, it doesn’t prevent inactivity, in my experience. For instance, my chat app at work will still show me inactive while running caffeinate. I have to do non-interactive training semi-regularly and need to interact to keep from looking like I’m away from my desk.

      • latexr 3 hours ago

        Have you used the `-u` flag? From the manual:

          -u      Create an assertion to declare that user is active.
        • mathieuh an hour ago

          Doesn’t work with Slack at least. I’ve had an iTerm window running `caffeinate -disu` for years. I think it used to work and stopped working in the last few months.

    • keybored 9 hours ago

      I was able to install a `caffeine` package with Apt on Linux. In that one the `caffeinate` command is supposed to be run with another command. While the `caffeine` command does what macOs `caffeinate` does.

    • weberer 7 hours ago

      It would be cool to have this activate when a Jupyter notebook is currently running a cell, and deactivate automatically when its finished.

      • eszed 2 hours ago

        This can be done by passing a PID. I believe there are other options, as well. (Not at my computer to look it up right now.) I haven't used those features "manually", but I have in scripts that I expect to generate long-running processes.

  • reaperducer 5 hours ago

    mdls shows a file's metadata.

    I use it most often for pulling lat lon data from photos.

  • pantulis 10 hours ago

    afconvert is pretty nifty for audio format conversion.

    • subarctic 9 hours ago

      is it better than ffmpeg in any way?

      • jammmety 8 hours ago

        Apple's AAC encoders are often touted as being the 'best', quality-wise: https://hydrogenaud.io/index.php/topic,119876.0.html

      • lozf 3 hours ago

        As jammmety said; for AAC encoding yes, but don't worry - you can have ffmpeg use that encoder to get the best of both.

      • FabHK 2 hours ago

        afconvert is the only way I've managed to turn mp3s into something that Books would accept as an audiobook.

            afconvert -v -s 3 -f m4bf ....mp3
  • adolph 4 hours ago

    > If you store your secrets in the Keychain (and you should!)

    As part of the OS, Keychain suffers from the same sorts of sharp edges as using a built-in interpreter. An alternative is to use a password manager. Below is an example of the tools available in one.

    https://developer.1password.com/docs/cli/get-started/#step-1...

    • joemi an hour ago

      Would you mind expanding on what these "sharp edges" are that you're warning about? I'm not really sure what you mean by this. Keychain has served me (and I imagine many others) really well for a while.

  • westurner 5 hours ago

    upgrade_mac.sh: https://github.com/westurner/dotfiles/blob/develop/scripts/u... :

      upgrade_macos() {
        softwareupdate --list
        softwareupdate --download
        softwareupdate --install --all --restart
      }