[HN Gopher] macOS command-line tools you might not know about
       ___________________________________________________________________
        
       macOS command-line tools you might not know about
        
       Author : Gadiguibou
       Score  : 1396 points
       Date   : 2023-06-27 12:08 UTC (10 hours ago)
        
 (HTM) web link (saurabhs.org)
 (TXT) w3m dump (saurabhs.org)
        
       | nanovision wrote:
       | Not a big fan of command lines. but my most used shortkey is
       | ALT+M with Maccy installed.
        
         | mattl wrote:
         | What does that do?
        
           | nanovision wrote:
           | Maccy ( https://maccy.app/ ) is a clipboard manager for Mac
           | and by Clicking ALT+M , it shows all the recent copied texts
           | in a popup.
        
             | mattl wrote:
             | Is that Option-M?
        
               | nanovision wrote:
               | I use external logitech keyboard, where it's Alt+M but
               | yes, it's actually Command+M on Macbook
        
               | mattl wrote:
               | Aha! They make Logitech keyboards with Macintosh keys now
               | btw.
        
       | hgurmen wrote:
       | It was nice to find out that macOS has a tool similar to Valgrind
       | called `leaks` that helps you find memory leaks!
        
       | kevwil wrote:
       | The `security` tool is handy too. I like the ability to store
       | passwords in the `login` Keychain and automate using them in the
       | terminal using `security find-generic-password`.
       | security find-generic-password -gw -l "${keychain_id}"
       | 
       | Super helpful for VPN automation scripts, easy logins to things
       | like Vault, etc. The security tool has tons of other handy
       | functions as well.
        
       | ExoticPearTree wrote:
       | pbcopy/pbpaste are a lifesaver when doing stuff on the command
       | line that has a lot of output and piping is not something you can
       | do.
       | 
       | networkQuality is something I really wish I knew about sooner.
        
         | hereonout2 wrote:
         | Also for things like sharing public ssh keys. Instead of "can
         | you send me your public key" and getting something with random
         | line breaks depending on the users text editor I just have to
         | ask them to "cat ~/.ssh/id_rsa.pub | pbcopy".
         | 
         | I also alias pbcopy / pbpaste on Linux too, so useful!
        
           | superq wrote:
           | The random linebreaks are ok - SSH can handle them. (that's
           | how Userify does it I think, too. it replicates whatever the
           | user provides.. no judgment :)
        
             | hereonout2 wrote:
             | Ah, it's more for ~/.ssh/authorized_keys which is one key
             | per line.
        
               | superq wrote:
               | right (authorized_keys ignores blank lines and comments)
        
           | jcotton42 wrote:
           | Fwiw, `clip` on Windows does the same as `pbcopy` (there's no
           | analog to pbpaste built in though)
        
       | balls187 wrote:
       | "say" with my laptop connected to my home bluetooth speakers is a
       | lot of fun with my kids.
        
       | renewiltord wrote:
       | I use:
       | 
       | ``` #!/usr/bin/env bash                   set -u
       | title=${2:-Shell}         msg=$1              osascript -e
       | "display notification \"$1\" with title \"$title\""
       | 
       | ```
       | 
       | As `~/bin/,notify` and put it at the end of long-running
       | commands:
       | 
       | ``` run_this_program && ,notify "Long program is done!" ```
        
         | Svetlitski wrote:
         | I can't help but ask, why ",notify" and not just "notify"?
        
           | renewiltord wrote:
           | I name all my personal programs prefixed by the comma. I
           | learnt it from someone on lobste.rs. No Unix utilities use
           | the prefix in their name and it is a valid filename.
           | 
           | So I can type , and I am sure it's my program and I'm not
           | running something else and it'll autocomplete among my list
           | of programs.
        
             | wpm wrote:
             | This is a very cool idea, I always hesitate to add a lot of
             | aliases to my zshrc since I never want to step on any toes.
        
       | miohtama wrote:
       | say - text-to-speech engine:
       | 
       | I would have expected that at the era of AI this would sound a
       | bit better than the Commodore 64 speech synthesis from 80s.
        
         | meepmorp wrote:
         | It's dependent on the voice you pick in system settings. If you
         | choose one of the siri voices for the system voice (not in the
         | siri settings, iirc), it sounds much more natural.
        
       | lapcat wrote:
       | Manage the Launch Services database:                 /System/Libr
       | ary/Frameworks/CoreServices.framework/Versions/A/Frameworks/Launc
       | hServices.framework/Versions/A/Support/lsregister
       | 
       | Manage file extended attributes (such as quarantine):
       | xattr
       | 
       | Execute a script (AppleScript or JavaScript):
       | osascript -e <statement>
        
         | cyberge99 wrote:
         | You can also prepend #!/usr/bin/osascript to a script and then
         | make it executable with chmod oag+x. You can then invoke it
         | normally in bash: ./filename.sh (or whatever)
        
         | spookthesunset wrote:
         | It's weird how macs don't come with a GUI for managing system
         | services. Windows does.. that being said the number of times
         | I've had to mess with system services on mac can probably be
         | counted with a few fingers...
        
       | Hamuko wrote:
       | You can use `say` to recreate your own Serial Experiments Lain
       | intros.                 say -v Whisper "Weird: Layer zero one"
        
         | blacksmith_tb wrote:
         | You may have to install extra voices somehow, looking at the
         | manpage for say, it seems like 'say -v ?' would list the voices
         | installed, but I don't seem to have any (like Whisper), though
         | plain old 'say "hello world"' does do a robotic voice which
         | must be the default.
        
           | Hamuko wrote:
           | You can install additional voices in System Settings -
           | Accessibility - Spoken Content - System voice - Manage voices
           | (in Ventura).
           | 
           | "Whisper" is listed under "English (US) - Novelty".
        
             | blacksmith_tb wrote:
             | Thanks, I found those with some digging, I see that even
             | just adding Whisper it's a 3.8GB dl, mostly to upgrade the
             | default voice apparently - I guess that's why it isn't all
             | included by default I guess!
        
           | jiripospisil wrote:
           | Not sure if you can install additional voices using the
           | command line, but the way you do it in the UI is Preferences
           | -> Accessibility -> Spoken Content, then select customize in
           | the voice selector and finally select the voice you want to
           | add.
        
       | BruceEel wrote:
       | Nice list.
       | 
       | Also, hidutil (https://developer.apple.com/library/archive/techno
       | tes/tn2450...).
       | 
       | Example:                    hidutil property --set '{"UserKeyMapp
       | ing":[{"HIDKeyboardModifierMappingSrc":0x700000049,"HIDKeyboardMo
       | difierMappingDst":0x700000065}]}'
       | 
       | For my PC keyboard, remaps "Ins" (normally useless under macOS)
       | to something ("PC Execute") I can trap and remap with Keyboard
       | Maestro.
        
         | hoherd wrote:
         | not to be confused with hdiutil:                   hdiutil
         | detach /Volumes/some-usb-drive              hdiutil makehybrid
         | -joliet -o foo.iso ./srcfolder/
        
         | maratc wrote:
         | hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifie
         | rMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x7000
         | 00035}]}'
         | 
         | Remaps top left key on Euro-style keyboards from useless
         | "paragraph" to useful "backtick".
        
           | kevans91 wrote:
           | Yes, this is great... I was given a Macbook with a Norweigan
           | keyboard for testing a port of FreeBSD on it, and I quickly
           | discovered that the keyboard layout remapping stuff available
           | via the UI won't remap at least this one key to what I'd find
           | on my US keyboard.
        
         | jiripospisil wrote:
         | There's a nice generator for these mappings https://hidutil-
         | generator.netlify.app/
        
       | MobiusHorizons wrote:
       | I didn't know about textutil before, I'll have to try that. Does
       | that use the same backend as pages for word documents? How good
       | is the conversion?
        
       | lasermike026 wrote:
       | Wow! So cool! Thanks!
        
       | alwillis wrote:
       | My latest discovery is being able to manage Xcode simulators from
       | the command line [1].
       | 
       | [1]:
       | https://developer.apple.com/documentation/xcode/installing-a...
        
       | tngranados wrote:
       | I didn't know about `taskpolicy`, I'll add it to my list. It will
       | be handy now that it's getting hot around here for long running
       | commands that I don't mind waiting for, Apple Silicon Macs run
       | cooler than Intel's but they can still get very hot when maxed
       | out.
        
       | knodi123 wrote:
       | > open - open files and applications
       | 
       | And urls! I use that one in a lot of my scripts. We have a
       | ticket-based workflow, and I can parse out the ticket number from
       | the current git branch, and open the ticket or create a merge
       | requests without having to do anything complicated.
        
       | asveikau wrote:
       | Not on the list, but I think `fs_usage` is an interesting one.
       | Like a firehose of disk activity.
        
       | whalesalad wrote:
       | `pbcopy | jq | pbpaste` is a very frequent command that I run to
       | quickly format json in the clipboard.
       | 
       | I use pbcopy and pbpaste probably all day long and always miss it
       | in Linux environments.
        
         | ngai_aku wrote:
         | Slick! I need to figure out how to get something like this for
         | SQL
        
         | photonerd wrote:
         | You should Alias xsel if you're in an x environment
        
         | hoherd wrote:
         | Also `alias pbsort='pbpaste | sort | pbcopy'`
        
       | callumprentice wrote:
       | Years ago, I wrote a script to find something in a big blob of
       | data and to alert me when it was done, I added a "say <some glib
       | Rambo or Schwarzenegger>" type phrase upon completion. I forgot
       | about it and went to bed and was jolted awake hours later by what
       | was clearly an "intruder" speaking to his accomplice, in my home
       | office. Quite the relief when I realized what happened.
        
         | no-dr-onboard wrote:
         | That's hilarious! Similar vein: there is a Metasploit module to
         | induce the say command on post-exploited mac machines. I
         | haven't seen it used in practice, but I eagerly watch for the
         | eventual twitter thread that reads:
         | 
         | "So, I used the msf module that invokes `say` on a client's
         | laptop"
        
         | joshstrange wrote:
         | I use Pushover for a few alerts so years ago I wrote a little
         | bash script called `push` that you pass a title and optionally
         | a body. Was very nice to to `./longRunningCommand && push "Task
         | Done" "Here is a body"`. I'd sometimes combine this with my
         | `beep` script that just makes a noise for when I know I'll
         | still be at my computer but want to know when something
         | finishes.
        
         | jeremy_wiebe wrote:
         | I often have multiple terminal tabs open. Sometimes I'll run a
         | command that ends up taking a while and switch away and forget
         | about it.
         | 
         | So I added a fish command completion script that plays a beep
         | with afplay if the task took longer than 5 seconds. It helps me
         | get back on task for those "just long enough" tasks that I run.
        
         | alanbernstein wrote:
         | I like to use the "research complete" sample from StarCraft for
         | this.
        
         | datavirtue wrote:
         | I would pay a lot of money to switch the voice to Arnold.
        
       | tommica wrote:
       | Oh, the `say` command is really damn useful to know about!
        
       | thomasahle wrote:
       | I just tried the following: I copied all of my ~/.bash_history
       | into GPT and asked it for some commands that would save me time.
       | It didn't quite work to identify "bad patterns" as I had hoped,
       | but it did suggest the following:
       | 
       | 1. _bat_ : A `cat` clone with syntax highlighting and Git
       | integration.
       | 
       | 2. _htop_ : Interactive process viewer, a better alternative to
       | `top`.
       | 
       | 3. _fzf_ : Command-line fuzzy finder to quickly search files,
       | command history, etc.
       | 
       | 4. _tldr_ : Community-driven man pages with practical examples.
       | 
       | 5. _ripgrep (rg)_ : Extremely fast text search tool, recursively
       | searches directories for a regex pattern.
       | 
       | 6. _tmux_ : Terminal multiplexer to run multiple terminal
       | sessions within a single window.
       | 
       | 7. _autoenv_ : Automatically source environment variables based
       | on the current directory.
       | 
       | 8. _hub_ : Extends git with extra features and commands for
       | GitHub.
       | 
       | 9. _ncdu_ : Disk usage analyzer with an ncurses interface.
       | 
       | 10. _jq_ : Lightweight command-line JSON processor.
       | 
       | 11. _sshfs_ : Mount a remote filesystem using SFTP.
       | 
       | 12. _watch_ : Execute a program periodically, showing output
       | fullscreen.
       | 
       | 13. _fd_ : Simpler and faster alternative to `find`.
       | 
       | 14. _z_ : Jump around directories based on frequent use.
       | 
       | 15. _lazygit_ : Simple terminal UI for git commands.
       | 
       | Most of them I already knew, but _z_ seems like an interesting
       | tool. The docs are here  <https://github.com/rupa/z>:
       | z foo         cd to most frecent dir matching foo
       | z foo bar     cd to most frecent dir matching foo, then bar
       | z -r foo      cd to highest ranked dir matching foo
       | z -t foo      cd to most recently accessed dir matching foo
       | z -l foo      list all dirs matching foo (by frecency)
       | 
       | Might start using it, if I'm not too stuck in my habits.
        
       | penjelly wrote:
       | wait caffeinate exists natively? ive been using a third party
       | caffeine tool for the longest time..
        
         | roycebranning wrote:
         | i'm most surprised that they got this one by HN community
        
         | jkubicek wrote:
         | For a long time I used an app for this as well, but the app was
         | just a thin wrapper around the CLI tool
        
           | penjelly wrote:
           | after seeing the post i realized this is probably the case
           | for most of us
        
         | hoosieree wrote:
         | Now if only I could remember how to spell caffeinate.
        
           | plorkyeran wrote:
           | I've only ever tab-completed it from caff.
        
           | samstave wrote:
           | Just make an alias to its other, easier to spell name
           | `Methyltheobromine`. Simple.
        
         | drooopy wrote:
         | That's surprising to me as well. I had no idea that caffeinate
         | existed as a native tool on my mac. I've been relying on "Jolt
         | of Caffeine" for the past 3 years.
        
         | sandyarmstrong wrote:
         | Yeah, I was thrilled when I discovered this for myself a few
         | months ago! It's so useful in long-running scripts.
        
       | koinedad wrote:
       | pbcopy and pbpaste are soooo helpful
        
       | Version467 wrote:
       | Great list. Didn't know about pbcopy/pbpaste, very useful.
       | 
       | I use open regularly. Often to open a directory in finder and
       | preview a file. Looks like I can just use qlmanage from now on.
       | 
       | Not sure I'd use screencapture manually, but I'm sure there are
       | some automations that could benefit from this.
        
         | gpspake wrote:
         | I suspect, like me, a lot of people have learned about
         | pbcopy/pbpaste from the Github docs for adding a new SSH key to
         | your account
         | https://docs.github.com/en/authentication/connecting-to-gith...
        
       | birdyrooster wrote:
       | I never knew sips was a thing, cool!
        
         | detourdog wrote:
         | Most people would rather criticize than actually look for
         | goodness.
        
       | elpakal wrote:
       | `xed .` Is probably my most underrated macOS command. It will
       | open Xcode using either your project or workspace file.
        
       | verst wrote:
       | A lot of macOS behavior can be toggled by modifying the system
       | component defaults.
       | 
       | For example, turn off autohiding of the Dock from commandline:
       | defaults write com.apple.dock "autohide" -bool "false" && killall
       | Dock
       | 
       | Include the date in screenshots you take:
       | defaults write com.apple.screencapture "include-date" -bool
       | "true"
       | 
       | Here is handy website which documents many of the defaults and
       | their purpose: https://macos-defaults.com/#%F0%9F%99%8B-what-s-a-
       | defaults-c...
        
         | llimllib wrote:
         | https://github.com/zcutlip/prefsniff can be handy for figuring
         | this stuff out, you start it up, change a setting, and it
         | reports the plist differences to you
        
           | andelink wrote:
           | Pretty cool tool it looks like. Gonna try using this. Also
           | has good resources in the README.
        
       | jakehilborn wrote:
       | Self-plug of displayplacer[0] for changing screen
       | resolutions/rotations/etc via the command line.
       | 
       | [0] https://github.com/jakehilborn/displayplacer
        
         | greenshackle2 wrote:
         | I was hoping this would let me set 125% scaling on my 3440x1440
         | display but no, I guess it's a hard OS limitation. It's my
         | biggest gripe with MacOS.
         | 
         | (There's BetterDisplay - formerly BetterDummy - but it
         | introduces noticeable input lag for me.)
        
         | janandonly wrote:
         | Does this tool also allow me to change my iPad screen on
         | Sidecar from landscape/horizontal into vertical?
        
           | jakehilborn wrote:
           | It's not something that I've tried. There was a user report
           | at the bottom of this GitHub issue that states sidecar
           | rotation does not work.
           | 
           | https://github.com/jakehilborn/displayplacer/issues/17
        
         | joshstrange wrote:
         | This tool is invaluable, I love it so much. I have 2 workspaces
         | and I love just running the command (via Alfred) when I plug
         | into my dock at either place that fixes all my monitors. I
         | could script it so that as soon as my computer recognizes a
         | monitor UUID it fires off the correct displayplacer command but
         | I don't switch often enough to care (the 2 desks are 3.5+ hours
         | apart).
         | 
         | When I was commuting daily displayplacer was even more
         | indispensable but even for just unplugging my mac and using the
         | internal screen vs my monitors I get a ton of value out of this
         | tool.
        
       | verst wrote:
       | I like to hide all icons or folders on my Desktop when I need to
       | be more productive or when I'm presenting. This can be done with:
       | # hide desktop icons and folders       defaults write
       | com.apple.finder CreateDesktop 0       killall Finder #
       | restarting Finder is required            # unhide desktop icons
       | and folders       defaults write com.apple.finder CreateDesktop 1
       | killall Finder # restarting Finder is required
       | 
       | I made myself a convenient bash alias for this which lets me
       | simply toggle the desktop on and off Here is a gist:
       | https://gist.github.com/berndverst/6f58c0d6aedddb6c06c23e57d...
       | toggledesktop () {         if [[ $(defaults read com.apple.finder
       | CreateDesktop) -eq "0" ]]         then             export
       | SHOWDESKTOP=1;             echo "Unhiding Desktop icons"
       | else             export SHOWDESKTOP=0;             echo "Hiding
       | Desktop icons"         fi         defaults write com.apple.finder
       | CreateDesktop $SHOWDESKTOP         killall Finder       }
        
       | brazzledazzle wrote:
       | Probably want to check your policies if using a business-owned
       | mac. Caffeinate probably violates your security policies if it's
       | a decent sized company.
        
         | Macha wrote:
         | I thought that was its primary use case these days
        
         | computerfriend wrote:
         | You can lock the screen while caffeinated though.
        
           | brazzledazzle wrote:
           | Automatic screensaver enable after a period of inactivity is
           | considered a fail safe control.
        
             | wpm wrote:
             | `caffeinate` can set assertions, the same assertions that
             | Zoom or PowerPoint or Keynote do to stop the screen going
             | to sleep during a meeting or presentation, the same
             | assertions that the browsers can set during streaming
             | video, so you absolutely can bypass whatever your admins
             | set using `caffeinate -dmisu` which sets every assertion
             | available.
        
         | pantulis wrote:
         | Why?
        
           | salzig wrote:
           | with sleep comes "unlock screen" ;)
        
             | Groxx wrote:
             | Caffeinate with -u and then lock your screen. (Apple menu
             | -> lock screen)
             | 
             | It'll stay connected/running/screen-on/etc but it's still
             | locked.
        
             | pantulis wrote:
             | Ouch! Thanks!
        
       | gregoriol wrote:
       | `tmutil` could be added to this list, it's a management cli for
       | Time Machine
        
         | hoherd wrote:
         | I don't even use Time Machine for my off-machine backups, but I
         | use tmutil to create local snapshots so I can easily back out
         | of changes by using the Time Machine GUI to restore files from
         | the snapshot.
        
       | Crontab wrote:
       | When a new MacOS release comes out, one of the first things I
       | look for is adds and changes to the command line tools. Sadly
       | they are not the things that most people care about on a new
       | release.
        
       | donatj wrote:
       | When mentioning `open` they should have noted that `open <file>`
       | will open the given file with its associated app.
       | 
       | It's indispensable.
        
         | computerfriend wrote:
         | Especially                   open .
         | 
         | if you need to drag a file somewhere. One thing that kind of
         | breaks my muscle memory here is the opposite, something like
         | firefox file.html
         | 
         | doesn't work and you have to fiddle with the arguments to get
         | open to launch a non-default application.
        
           | zora_goron wrote:
           | I use `open .` to open up a Finder window of the directory
           | I'm currently in using Terminal so frequently that I've set
           | up an alias for it --                 alias op='open .'
        
             | ojosilva wrote:
             | It took me a while but I finally got open to open folders
             | in a new Finder tab instead of opening a new window each
             | time.                    function opent () {
             | what=${1:-`pwd`}             what=$(cd "$what"; pwd)
             | osascript -e "tell application \"Finder\"
             | activate             set t to target of Finder window 1
             | set toolbar visible of window 1 to true             end
             | tell             tell application \"System Events\"
             | keystroke \"t\" using command down             end tell
             | tell application \"Finder\"             set target of
             | Finder window 1 to POSIX file \"$what\"             end
             | tell" > /dev/null         }              ## opens current
             | dir         $ opent .         ## same         $ opent
        
           | alanpearce wrote:
           | If you set                   alias firefox="open -a Firefox"
           | 
           | This will work
        
         | lloeki wrote:
         | More than that, it sends a message to launchd/the app instead
         | of forking on the spot.
         | 
         | Sadly the app does get the shell's environment and it can't be
         | disabled:                    Opened applications inherit
         | environment variables just as if you had          launched the
         | application directly through its full path.  This behavior
         | was also present in Tiger.
         | 
         | Why this matters, e.g with vscode:                   - ensure
         | vscode is fully closed         - enter project directory,
         | something sets vars in your shell (you manually or
         | automatically via direnv)         - code .         - vscode
         | process now has the env from the shell it was started         -
         | open another directory from the UI         - vscode forks and
         | inherits from its parent process, thus the other project window
         | has the original shell's env         - go to another directory
         | - code .         - vscode finds out it's already running, forks
         | and opens another window. this window has the original shell
         | env         - fully quit vscode and reopen it, but via the app
         | in /Applications         - vscode opens, now has a blank
         | environment for its main process, and forks form there to
         | restore previous windows, which now lack the environment they
         | had
         | 
         | It's a) completely inconsistent and b) dangerous: imagine the
         | original shell had a setting or secret in an env var that was
         | shared to the second project (e.g virtualenv, deploy target,
         | deployment key...)
         | 
         | The same issue can happen with other apps but also tmux (the
         | tmux daemon is spawned from the first tmux command, and then
         | subsequent sessions from tmux-server; doing it another way is
         | possible but nontrivial)
         | 
         | https://github.com/microsoft/vscode/issues/15452
         | 
         | https://github.com/microsoft/vscode/issues/108804#issuecomme...
        
         | lattalayta wrote:
         | I also find myself using open -n -a <application> to open a new
         | separate instance of an application if I want to copy settings
         | from one file to another or work on two files with separate
         | instances of a program
        
       | thadk wrote:
       | Having ChatGPT or equivalent create a basic Makefile for these
       | commands (and other commands) is a quick way to preserve your
       | process for later. You can show it your file structure first too.
        
       | apocalyptic0n3 wrote:
       | `open` is one I use all the time. I love that simple command.
       | alias tab='open . -a iterm'         alias phpstorm='open -a
       | "PhpStorm"'         alias smerge='open -a "Sublime Merge"'
       | 
       | etc. I use those more than I do the Open/Recents dialogs in the
       | respective apps.
        
         | jonpalmisc wrote:
         | Sublime Text and Sublime Merge actually ship with these CLI
         | utilities by default, which have some additional features:
         | $ fd 's(merge|ubl)$' /Applications/Sublime*
         | /Applications/Sublime
         | Merge.app/Contents/SharedSupport/bin/smerge
         | /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl
        
         | Sujeto wrote:
         | I made a script to open files with rofi
         | 
         | https://github.com/davatorium/rofi
         | 
         | Looks like this:
         | 
         | https://i.imgur.com/Hm9TGeV.jpg
         | 
         | In a vscode terminal I just use the alias "o" and it opens that
         | at the correct location, then I can navigate and pick a file to
         | open in the editor.
        
         | baliex wrote:
         | To open a new finder window in the current directory in a
         | terminal:                   alias finder='open .'
        
         | Kyuuketsuki wrote:
         | One flag also not mentioned is -n, which allows you to run the
         | same application in more than one instance. Historically the
         | single most used utility for me, though the number of
         | applications that have had design problems bad enough to
         | warrant it has gone down.
        
         | movedx wrote:
         | > alias tab='open . -a iterm'
         | 
         | But if you just open a new tab, you'll be in the same $CWD in
         | the new tab? Am I missing some trick here?
        
       | xenodium wrote:
       | A couple of built-in I didn't see:
       | 
       | macOS software versions:                   sw_vers
       | 
       | macOS hardware overview:                   system_profiler
       | SPHardwareDataType
       | 
       | Convert binary plist to xml                   plutil -convert
       | xml1 -o out.xml in.plist
       | 
       | A couple of lesser known, but also handy ones to install:
       | brew install dark-mode              brew install duti
       | 
       | > screencapture - take screenshots
       | 
       | Big fan of screencapture. I wanted something similar but for
       | capturing window videos, so I built
       | https://github.com/xenodium/macosrec
       | 
       | I often wrap command line utilites with Emacs functions (don't
       | need to remember invocation flags/structure but also enables
       | batch invocations) https://xenodium.com/recordscreenshot-windows-
       | the-lazy-way
        
       | rogual wrote:
       | A fun one I use surprisingly often is                   open -h
       | AppKit.h
       | 
       | to open any system header file (or I guess any header in the
       | standard include path? It finds stuff from Homebrew too.)
        
       | Etheryte wrote:
       | Neat, I was not aware of `networkQuality`. A good replacement for
       | opening up Speedtest or whatnot when you just want to figure out
       | if the network is slow or something else is up.
        
         | gargs wrote:
         | It seems to grossly underestimate my upload bandwidth!
        
           | audessuscest wrote:
           | same
        
           | samstave wrote:
           | What are you, a station wagon full of thumb drives?
        
         | zgluck wrote:
         | I can't find any (official) documentation on how it measures
         | the speed. Against which target?
         | 
         | Edit: Found https://www.macinstruct.com/tutorials/how-to-check-
         | your-macs... which says:
         | 
         | "The networkquality tool uses Apple's CDN (https://mensura.cdn-
         | apple.com/api/v1/gm/config) as a target"
         | 
         | The contents of this file (for me):                 {
         | "version": 1,         "test_endpoint": "sesto4-edge-
         | bx-021.aaplimg.com",         "urls": {
         | "small_https_download_url": "https://mensura.cdn-
         | apple.com/api/v1/gm/small",
         | "large_https_download_url": "https://mensura.cdn-
         | apple.com/api/v1/gm/large",             "https_upload_url":
         | "https://mensura.cdn-apple.com/api/v1/gm/slurp",
         | "small_download_url": "https://mensura.cdn-
         | apple.com/api/v1/gm/small",             "large_download_url":
         | "https://mensura.cdn-apple.com/api/v1/gm/large",
         | "upload_url": "https://mensura.cdn-apple.com/api/v1/gm/slurp"
         | }       }
        
           | Etheryte wrote:
           | I find solace in the fact that even at large companies,
           | there's still enough whimsy to name your upload endpoint
           | slurp.
        
         | wlonkly wrote:
         | There is also a CLI client for speedtest.net[1] and
         | fast.com[2]! Not included with MacOS, of course, but nice to
         | have around.
         | 
         | [1] https://www.speedtest.net/apps/cli
         | 
         | [2] https://github.com/sindresorhus/fast-cli
        
       | iNic wrote:
       | `mdfind` and `networkQuality` seem very useful!
        
       | dcow wrote:
       | I'm surprised TFA doesn't mention `plutil` and its counterpart
       | `PlistBuddy`. They're like the `jq` of macOS.
       | 
       | https://scriptingosx.com/2016/11/editing-property-lists/
        
       | codetrotter wrote:
       | Shoutout to the `diskutil` command line utility on macOS.
       | 
       | I had problems with some slices on a disk today, and was not able
       | to fix it with the graphical Disk Utility that comes with macOS.
       | These slices were remnants from experimenting with running Asahi
       | Linux on the machine in the past.
       | 
       | I knew there had to be a way to fix it with diskutility cli
       | program.
       | 
       | I found a thread, and the solution for what to do in such
       | situation.
       | 
       | https://apple.stackexchange.com/questions/411544/cant-reclai...
       | 
       | Now the disk can be fully utilised by macOS again.
        
         | wpm wrote:
         | `diskutil` is great but it's a travesty what they did to Disk
         | Utility.app. It never really got any love after the APFS
         | transition and there are things it straight up fails to do the
         | `diskutil` command doesn't. Before they re-designed the
         | interface, it was such a rock-solid tool that even if it failed
         | during some task, would typically tell you why. Now it's a baby
         | LEGO Duplo interface meant for nothing more than reformatting a
         | flash drive.
        
       | coding123 wrote:
       | Caffienate will save my ass going forward. I don't know how many
       | times I end up being the person that runs some batch job on my
       | system...
        
         | cpach wrote:
         | Here's a nice GUI wrapper:
         | https://apps.apple.com/us/app/amphetamine/id937984704 (the name
         | might be off-putting to some though)
        
       | bpye wrote:
       | Caffeinate is definitely the one I miss most on Windows. Super
       | handy to keep your machine awake whilst some task is ongoing.
        
         | baal80spam wrote:
         | There is a counterpart:
         | https://www.zhornsoftware.co.uk/caffeine/
        
         | redacted wrote:
         | If you're able to install PowerToys it includes a utility for
         | this
         | 
         | https://learn.microsoft.com/en-us/windows/powertoys/awake
        
         | Alifatisk wrote:
         | I believe you can still get it, if not, there are similar like
         | Amphetamine
        
         | jimt1234 wrote:
         | Amphetamine has been my go-to app for keeping my Mac alive,
         | especially since Apple tried to remove it from the App Store
         | because, according to [someone?], the name violated App Store
         | rules.
         | 
         | https://apps.apple.com/us/app/amphetamine/id937984704
        
         | perfect-blue wrote:
         | I've been looking for a better way to do this than just setting
         | my PC to never sleep. Thanks for this. Now I need to find a Mac
         | alternative as well.
        
           | philbarr wrote:
           | caffeinate is on Mac.                 caffeinate -d -i -u -s
        
             | perfect-blue wrote:
             | Thanks very much for this.
        
           | lattalayta wrote:
           | keeping you awake wraps this up in a menu bar icon that makes
           | it easy to toggle on or off
           | 
           | https://keepingyouawake.app/
        
       | SpaghettiX wrote:
       | There is an even longer and useful list on
       | https://git.herrbischoff.com/awesome-macos-command-line/abou...
        
       | js2 wrote:
       | Some that were missed:
       | 
       | diskutil: modify, verify and repair local disk
       | 
       | hdiutil: manipulate disk images (attach, verify, create, etc)
       | 
       | dscl: Directory Service command line utility (manage users and
       | groups)
       | 
       | scutil: Manage system configuration parameters (useful for
       | checking current DNS configuration and checking reachability to a
       | host).
       | 
       | sysadminctl: It's a secret! No man page. Run without options to
       | get a usage message, but even the usage is apparently incomplete.
       | It's a grab-bag of functionality. I use for adding/removing a
       | temporary build user as part of a CI/CD setup.
        
       | hk1337 wrote:
       | I was aware of about half of these but textutil, networkUtility,
       | and sips I didn't not and look really interesting
        
         | jfb wrote:
         | We heavily used `sips` when I was at Apple, because it was
         | quicker than writing code against QuickTime or the other
         | rendering subsystems.
        
         | oneeyedpigeon wrote:
         | Yeah, sips has a lot of potential. The article doesn't mention
         | it, but it can crop as well which could be a real game-changer!
        
       | kart23 wrote:
       | CUPS tools are also awesome.
       | 
       | https://opensource.apple.com/source/cups/cups-450/cups/doc/h...
        
       | daneel_w wrote:
       | afconvert(1) lets you convert between various audio formats -
       | most noteworthy is that it gives you access to Core Audio's
       | superior AAC encoder without having to use iTunes/Music:
       | afconvert music.wav -o music_160kbps_aac.m4a -b 160000 -q 127 -s
       | 2 -f m4af -d 'aac '
       | 
       | lipo(1) lets you operate (replace/extract/thin/etc) on
       | executables and libraries to tailor their supported
       | architectures:                 lipo <universal exe/dylib> -thin
       | arm64e -output <new apple silicon-only exe/dylib>
        
         | daneel_w wrote:
         | Also, using hdiutil(1) and diskutil(8) to create a RAM-disk:
         | # 500 megabytes disk image       mb=$((500*2048))
         | diskutil eraseVolume ExFAT my_ramdisk `hdiutil attach -nomount
         | ram://$mb`
        
       | Xen9 wrote:
       | It's rare to see a "you might not know about" instead of "you
       | never thought about" etc.
        
       | boffinAudio wrote:
       | Wut? No fs_usage? Easily one of the most useful of them all ..
       | 
       | https://www.manpagez.com/man/1/fs_usage/
       | 
       | I can't count the number of times a bit of fs_usage foo has
       | helped me dig out of a seriously messy pile of network, file and
       | page fault issues ..
        
         | photonerd wrote:
         | Useful, but definitely more niche & less generally applicable
         | than the others.
        
       | semanticist wrote:
       | /System/Library/PrivateFrameworks/Apple80211.framework/Versions/A
       | /Resources/airport
       | 
       | I set an alias in my shell so this is just 'airport', lets you
       | interact with the wifi settings - I particularly like 'airport
       | -s' for doing a scan of the local wifi networks, since it shows
       | signal strength and channel information right there, which is
       | helpful when troubleshooting.
        
         | lloeki wrote:
         | It also separates 2.4GHz and 5.0GHz bands and shows security
         | details (which matters sometimes e.g band steering or automatic
         | same-SSID signal-strength-based AP selection doesn't work)
        
       | wkat4242 wrote:
       | Not a command-line tool but the network link conditioner is also
       | really great. Never seen such a tool on another OS
       | 
       | You can simulate a really bad network. Latency, bandwidth, packet
       | loss etc. Great for testing but also if people insist on cameras
       | being on. Just screw up the connection so bad that everyone gets
       | annoyed with your blocky image and robot voice and suggest you
       | turn off video and then you make it 'magically' ok - lol
        
         | elpakal wrote:
         | You can do similar magic with Charles Proxy fyi
        
         | nine_k wrote:
         | Toxiproxy is such a tool for everywhere else, and it did help
         | me test and improve networking code for poor conditions:
         | timeouts, retries, packet loss, etc.
        
         | llarsson wrote:
         | You can be an ultra nerd on Linux and go this with the
         | networking QoS tools: https://tldp.org/HOWTO/Traffic-Control-
         | HOWTO/components.html
        
         | Arubis wrote:
         | [Comcast](https://github.com/tylertreat/comcast) also does this
         | for macOS, BSD, and Linux. And it's _brilliantly_ named.
        
           | wkat4242 wrote:
           | Thanks! I'm on BSD so this is great to hear!
        
         | obituary_latte wrote:
         | Never had heard of this before. Some other cool tools in the
         | "additional tools for X-Code" package which I had also never
         | heard of. https://developer.apple.com/download/all/
         | 
         | Thanks for sharing.
        
           | llimllib wrote:
           | I've used AU Lab to pipe my microphone input through my
           | headphones, which is apparently how professionals like to
           | record audio (a "monitor" so you can hear how you sound), but
           | I couldn't get used to it
        
         | pwenzel wrote:
         | Network Link Conditioner rules. I pair it with `mitmproxy` for
         | debugging native apps.
        
           | macshome wrote:
           | You can also use `rvictl` to connect to a development iOS
           | device's network device for grab a tcp dump.
           | 
           | Also Instruments has a really nice network capture tool now.
        
       | joshSzep wrote:
       | `caffeinate` is a game changer. Now I can keep my Slack status
       | green without sitting in an empty zoom room. #WFHLife ;)
        
         | theshrike79 wrote:
         | Amphetamine does the same thing, but with a task bar icon and
         | better usability:
         | https://apps.apple.com/us/app/amphetamine/id937984704?mt=12
        
           | datavirtue wrote:
           | Or a full screen YouTube Mozart video that lasts for six
           | hours
        
         | lkuty wrote:
         | I use `caffeinate -dsim` permanently. In short I ask the
         | computer to avoid any kind of sleep.                 -d Create
         | an assertion to prevent the display from sleeping.       -i
         | Create an assertion to prevent the system from idle sleeping.
         | -m Create an assertion to prevent the disk from idle sleeping.
         | -s Create an assertion to prevent the system from sleeping.
         | This          assertion is valid only when system is running on
         | AC power.
        
       | silly_squidward wrote:
       | You should check out "um" https://github.com/promptops/cli for
       | when you can't remember the command/parameters.
       | 
       | ~ um prevent my mac from sleeping for 30m
       | caffeinate -u -t 1800         don't see what you're looking for?
       | try providing more context
        
       | sovietswag wrote:
       | Needs to mention afplay for playing audio! You can easily use
       | this to make a command-line MP3 player.
       | 
       | Others have mentioned the "say" utility for speech synthesis.
       | There is a lot you can do with it, it supports the TUNE format,
       | which allows you to "shape the overall melody and timing of an
       | utterance... for example ... to make an utterance sound as if it
       | is spoken with emotion".
       | 
       | See: Apple's Speech Synthesis Programming Guide,
       | https://josh8.com/blog/img/speech-synthesis.pdf
       | 
       | I also wrote more about this here:
       | https://josh8.com/blog/commandline-audio-mac.html
        
         | microtherion wrote:
         | Unfortunately, the TUNE format turned out to be a bit of an
         | evolutionary dead end; the last generation of Speech Synthesis
         | that supports it is the Alex voice which shipped in 2007, and
         | it's highly unlikely in my opinion that we'll ever see it again
         | -- pinpoint control of synthesis and naturalness are inherently
         | in tension, and the latter is a lot more valuable.
        
       | 29athrowaway wrote:
       | pandoc is the definitive document converter.
        
       | karmakaze wrote:
       | Another good one is 'hidutil' which can remap any keys without
       | additional software. It's handy for things like remapping
       | CapsLock to anything, etc. For actual full keyboard layouts
       | though I'd use Ukelele[0].
       | 
       | [0] https://software.sil.org/ukelele
        
         | ris58h wrote:
         | There is a helper tool for hidutil https://hidutil-
         | generator.netlify.app/
         | 
         | > It's handy for things like remapping CapsLock to anything
         | 
         | It's a built-in MacOS feature that you can find in the keyboard
         | settings.
        
       | strogonoff wrote:
       | You can use sips together with iconutil to generate a complete
       | .icns file for your app from a single 1024 by 1024 PNG without
       | any third party software:                   mkdir MyIcon.iconset
       | cp Icon1024.png MyIcon.iconset/icon_512x512@2x.png         sips
       | -z 16 16     Icon1024.png --out MyIcon.iconset/icon_16x16.png
       | sips -z 32 32     Icon1024.png --out
       | MyIcon.iconset/icon_16x16@2x.png         sips -z 32 32
       | Icon1024.png --out MyIcon.iconset/icon_32x32.png         sips -z
       | 64 64     Icon1024.png --out MyIcon.iconset/icon_32x32@2x.png
       | sips -z 128 128   Icon1024.png --out
       | MyIcon.iconset/icon_128x128.png         sips -z 256 256
       | Icon1024.png --out MyIcon.iconset/icon_128x128@2x.png
       | sips -z 256 256   Icon1024.png --out
       | MyIcon.iconset/icon_256x256.png         sips -z 512 512
       | Icon1024.png --out MyIcon.iconset/icon_256x256@2x.png
       | sips -z 512 512   Icon1024.png --out
       | MyIcon.iconset/icon_512x512.png         iconutil -c icns
       | MyIcon.iconset
       | 
       | As a bonus, generate .ico with ffmpeg:                   ffmpeg
       | -i MyIcon.iconset/icon_256x256.png icon.ico
       | 
       | Incidentally, does anyone know enough about the way sips scales
       | PNGs to confirm that it makes sense to create the 16px version
       | straight from 1024px, as opposed to basing it off 32px (and all
       | the way up)? I.e., is it better to downscale in fewer steps (as
       | currently) or in smaller steps?
        
         | photonerd wrote:
         | additional bonus, you can input an SVG at the start if you use
         | qlmanage first instead of the cp command:
         | 
         | qlmanage -t -s 1024x1024 -o MyIcon.iconset/Icon1024.png
         | icon.svg
        
           | strogonoff wrote:
           | Note of caution: if qlmanage uses QuickLook SVG rendering,
           | YMMV. I recently had to deal with SVGs that render broken in
           | Finder but correctly in, say, Affinity or Adobe tools.
           | 
           | Rasterization feels sufficiently finicky that I personally
           | would consider it part of designer's workflow rather than
           | automated conversion pipeline; but then some would say the
           | same about raster versions at different sizes, so in the end
           | it depends on what you can and want spend resources at.
           | 
           | If it does work for you, though, you could generate every
           | size from SVG directly and skip sips altogether (but you
           | should check both methods to see which gives you a better
           | quality icon, at small sizes single pixels can matter and so
           | it would depend on how qlmanage handles rasterization to
           | different sizes).
        
             | photonerd wrote:
             | That's fair. I will say, I've found that svgs that only
             | rendered "right" in Adobe/Affinity to be broken most other
             | places too.
             | 
             | May be a version thing, may be some extended stuff that
             | more common parsers do not support, not sure.
        
       | mechanicker wrote:
       | Use 'ditto' for copying directories. It is fast!
       | 
       | https://osxdaily.com/2014/06/11/use-ditto-copy-files-directo...
        
         | cpach wrote:
         | Ditto can also be useful for backup and restore since, AFAICT,
         | it preserves file meta data. (Unlike rsync for example.)
        
       | massysett wrote:
       | Is there a place Apple documents these things? Do people find
       | these things with something like "ls /usr/bin" and wondering
       | "what is this?" or does Apple have an administrator's guide
       | somewhere? Or has someone written a good book with this stuff?
        
         | saurabhsharan wrote:
         | Hi, author here. There isn't any official canonical
         | documentation that I know of, outside of the individual man
         | pages. This was a list of commands I've been maintaining for
         | myself over the years and thought it would be useful to share.
         | 
         | If you want more like this, I also have another page full of
         | lesser well-known macOS tips and tricks:
         | https://saurabhs.org/macos-tips
        
           | tlh wrote:
           | Oh my, and a bucket load of iOS tips too!
           | 
           | TIL you can tap and drag with 2 fingers to multi-select list
           | items in mail and notes, etc
           | 
           | Bless you for finding and collating
        
       | rockbruno wrote:
       | Xcode uses `mdfind` to provide symbols in crash reports and for
       | Instruments, and is the reason why it seems to have a life of its
       | own and work only when it wants to. Spotlight indexing is
       | extremely flaky for reasons I'm not aware of.
        
       | klausa wrote:
       | `pbcopy` and `pbpaste` are one of my most-loved in the list.
       | 
       | Dealing with some minified json, switching to iTerm, doing
       | `pbpaste | json_pp | pbcopy` and having a clean output is _so_
       | nice.
        
         | dredmorbius wrote:
         | I've aliased that (and its equivalents on Linux and
         | Android/Termux) to 'xc' and 'xp' (for X11 Copy and X11 Paste,
         | as I'd originated this on Linux).
         | 
         | Being able to populate or read from the system clipboard (or
         | secondary clipboard!), or to feed it, _including by reading
         | from or writing to pipes_ is wonderful.
        
         | burnished wrote:
         | Json pretty printing in the terminal? Bless, didn't know about
         | that and it is perfect
        
         | adolph wrote:
         | pb[paste|copy] are a life improver. Here is a one-liner to edit
         | the pasteboard contents in vim.                 pbpaste > tmp;
         | vim tmp; cat tmp | pbcopy; rm tmp;
         | 
         | I also use pbpaste to append various notes to files, but since
         | pbpaste doesnt have a newline at the end I wind up using:
         | echo "$(pbpaste)" >> notes.txt
        
           | dharmab wrote:
           | You can do this specific task with just vim:
           | https://vi.stackexchange.com/a/21448
        
         | jonnycomputer wrote:
         | Yes. I use it a great deal, but I haven't gotten used to using
         | the linux equivalents. I guess that would be either xsel or
         | xclip. Maybe I should create a "pbcopy" that runs one of those.
         | I like to minimize the cognitive load when I switch between mac
         | and linux command line environments.
        
         | gdavisson wrote:
         | I find that the `pbpaste | something | pbcopy` idiom is common
         | enough that it's worth having a shell function for it:
         | pbfilter() {           if [ $# -gt 0 ]; then
         | pbpaste | "$@" | pbcopy           else               pbpaste |
         | pbcopy           fi       }
         | 
         | Then you can use something like `pbfilter json_pp` or `pbfilter
         | base64 -d` or `pbfilter sed 's/this/that/'` or whatever.
         | 
         | This version also can also act as a plain-text-only filter. If
         | you just use `pbfilter` with no argument, it'll remove any
         | formatting from the text in the pasteboard, leaving just
         | straight plain text.
         | 
         | It does have a some limitations, though: you can't use it with
         | an alias, or pipeline, or anything complex like that. The
         | filter command must be a single regular command (or function)
         | and its arguments.
        
         | inanutshellus wrote:
         | I love this flow! Such a powerful and clean way to solve text
         | issues.                   # This will remove Windows double-
         | spaced empty lines from your copy/paste buffer         alias
         | winlines="sed '/^$/{$!{N;s/\n//;};}'"                  # pbw =
         | [P]aste [B]uffer to fix [W]indows line endings         alias
         | pbw="pbpaste | winlines | pbcopy"
         | 
         | Also - if you want `pbpaste` and `pbcopy` on Linux...
         | # imitate MacOS's paste buffer copy/paste:         alias
         | pbcopy='xsel --clipboard --input'         alias pbpaste='xsel
         | --clipboard --output'
        
           | computerfriend wrote:
           | Here's the xclip way (almost the same actually).
           | alias pbcopy="xclip -selection clipboard"         alias
           | pbpaste="xclip -selection clipboard -o"
        
             | lordgrenville wrote:
             | I use this, and another Mac affordance I copy in Linux is
             | alias open="xdg-open"
        
           | lozf wrote:
           | There's `wl-copy` and `wl-paste` for Wayland users too, via
           | https://github.com/bugaevc/wl-clipboard
        
             | netr0ute wrote:
             | And `cb` which works cross-platform, via
             | https://github.com/Slackadays/clipboard
        
         | nine_k wrote:
         | Those are so useful that I wrote trivial shell functions that
         | do the same under Linux.
        
           | timf wrote:
           | Since I'm bouncing between OSX and Linux a lot, I have a
           | shell script with the same name on each that boils down to:
           | if [ `uname` == "Darwin" ]; then         pbcopy       else
           | xsel --clipboard       fi
        
             | cerved wrote:
             | why not just alias?
        
         | iuafhiuah wrote:
         | I find it so annoying that these only work with plain text and
         | RTF. On X11 there is `xclip`[0] and on Wayland there is `wl-
         | clipboard`[1] both of which support binary file formats either
         | through parsing the header or explicitly setting the MIME type.
         | 
         | This means you can do things like copy an image from the
         | terminal and paste it into a graphical program like a browser
         | or chat client and vice-versa. Also can be very useful in shell
         | scripts for desktop automation.
         | 
         | The workaround on MacOS is to use AppleScript via `osascript`
         | to `set the clipboard to...`.                 [0]
         | https://github.com/astrand/xclip       [1]
         | https://github.com/bugaevc/wl-clipboard
        
         | zimpenfish wrote:
         | Extra handy when combined with `piknik`[1] for
         | distributed/cross-Apple account clipboard shenanigans.
         | 
         | [1] https://github.com/jedisct1/piknik
        
         | duffyjp wrote:
         | I have an alias that while trivally simple is quicker to type
         | and remember. It copies whatever file you give it to the
         | clipboard which is super handy. I use it with the "Compare with
         | Clipboard" to diff a file in Rubymine for example.
         | 
         | alias clip='pbcopy <'
        
         | m463 wrote:
         | I have a script always running that polls for youtube URLs
         | using pbpaste and runs yt-dl
         | 
         | then just highlight any youtube link and COPY
         | 
         | later when I have time, I can use quicklook to browse directory
         | of youtube videos.
        
         | n8henrie wrote:
         | So much of my Linux use is over ssh from a MacOS client that
         | I've made a `pbcopy` executable that just pipes stdin over ssh
         | to my MacBook to its pbcopy (with a dedicated ssh key that runs
         | this as a forced command). Makes it super nice to be on an SSH
         | session and `pbcopy` some content to my MacOS clipboard!
        
           | danielagos wrote:
           | That sounds amazing, I always wanted to do that! Do you have
           | a guide or some script to help with it? Otherwise, I will try
           | to do it on my own.
        
         | lloeki wrote:
         | Another frequent use I have, applying random diffs with git:
         | git diff | pbcopy         pbpaste | git apply
        
           | js2 wrote:
           | You can also use `git format-patch` and `git am` if you want
           | to apply the same commit to multiple repos, a use-case I
           | sometimes I have.
        
             | verst wrote:
             | I should use `git format-patch` instead of creating a mock
             | draft PR (which I end up deleting) and modifying the URL to
             | add `.patch` and then downloading the patch file haha. `git
             | format-patch` would probably be faster :)
        
         | agmm wrote:
         | I like to use `pbcopy` when exporting public keys to external
         | services like GitHub.
         | 
         | `cat ~/.ssh/mykey.pub | pbcopy`
        
           | wincy wrote:
           | I love this tool too!
           | 
           | except one time I quickly typed
           | 
           | `cat ~/.ssh/mykey | pbcopy`
           | 
           | And sent it straight away to my coworker on Slack.
           | 
           | I then spent the rest of the day making a new private key and
           | adding my new pubkey to all of the 1000+ servers I had root
           | access to. I mean we had tools to help but it still wasn't
           | fun.
           | 
           | With great power/convenience comes the potential to do dumb
           | things at lightning speeds!
        
             | gunapologist99 wrote:
             | Userify would have made that pretty painless (all it really
             | seems to do is update the authorized_keys across all of
             | your servers every minute or so)
        
               | superq wrote:
               | also userify allows you to set up sudo access on some of
               | the servers and not others, so that'd take care of the
               | other root-access issue you have. (sudo also provides
               | auditing/logging controls that are useful in a multi-user
               | environment)
        
             | vinay_ys wrote:
             | If you literally have ssh root access to 1000+ servers,
             | using certificates will be more secure and convenient than
             | directly using public key.
        
             | oxygen_crisis wrote:
             | I might start naming my private key files
             | ~/.ssh/keyname.PRIVATE after hearing that story...
        
               | plorkyeran wrote:
               | That's not a bad idea. I've never actually made the same
               | mistake, but I have caught it at the last moment and
               | having tab complete not pick the private one first would
               | help.
        
               | wincy wrote:
               | It would have avoided it! I was using tab and forgot to
               | select .pub as you correctly surmised. I was a junior dev
               | at the time and all the seniors got a good laugh out of
               | it, and I use it as a cautionary tale about trying to be
               | TOO overeager and efficient.
        
             | xrisk wrote:
             | put your private key in something like Secretive:
             | https://github.com/maxgoedjen/secretive
        
           | _rend wrote:
           | You can even simplify this further by feeding `pbcopy` the
           | key directly using file redirection instead of a pipe:
           | 
           | `pbcopy < ~/.ssh/mykey.pub`
           | 
           | (I use this all the time myself!)
        
         | systems_glitch wrote:
         | Best way to get ssh keys into the paste buffer too.
        
         | mig39 wrote:
         | It's cool to use pbcopy and pbpaste with your phone! Copy some
         | text on the phone, and you can pbpaste it onto the Mac command
         | line. So cool.
        
           | nojs wrote:
           | It creeps me out when the clipboard is unexpectedly shared
           | between my phone and computer. And since the feature seems to
           | turn on randomly but not reliably when I want it to, I'd
           | rather it just didn't exist.
        
             | pjot wrote:
             | Make sure both your phone and computer have Wi-Fi and
             | Bluetooth turned on.
        
               | MikeTheGreat wrote:
               | I'm curious why the Bluetooth is required?
               | 
               | Requiring WiFi makes (so the phone/computer is on a
               | network and can communicate with the other devices), but
               | what's the benefit of Bluetooth? Does it only work when
               | the phone and computer are near each other?
        
               | borski wrote:
               | Yes.
        
               | hanche wrote:
               | Bluetooth is used to discover peers and to initiate
               | communication. Thus handoff works even on a wifi network
               | that blocks broadcasts. It even works when no wifi
               | network is present, by setting up an ad hoc network for
               | the connection. (Disclaimer: This is all I know. The
               | details seem rather murky, as handoff is a proprietary
               | Apple protocol.)
        
             | jacurtis wrote:
             | I have a clipboard manager application called "Paste"
             | (creative i know). Its an awesome app for a million
             | reasons. But one thing I like is that it allows me to see
             | and hear when my iphone copy worked.
             | 
             | So I have it enabled so there is a sound when something
             | goes into the clipboard. Even on my mac, I have come to
             | rely on that audio feedback. But it has the added benefit
             | that when I am using my phone in front of my computer and I
             | copy something on my phone, I immediate (and it is
             | impressively fast... maybe a 200ms delay), I hear the chime
             | that something was added to my clipboard on my mac. So it
             | gives you that good feedback that a copy "worked".
             | 
             | You can also shift+cmd+V to see the clipboard history,
             | which is another complimentary tool with universal
             | clipboard because if a paste isn't working as expected you
             | can see if the universal copy never "took" (as you
             | mentioned it is semi-unreliable), or if it just got
             | overridden. You can then use the navigator to paste the
             | older item.
        
               | zackmorris wrote:
               | I wonder if it's this one:
               | https://apps.apple.com/us/app/paste-clipboard-
               | manager/id9678...
               | 
               | I've noticed that more and more apps on both macOS and
               | iOS sniff the clipboard contents and randomly clobber it.
               | I usually notice it in apps like Sourcetree, where I'll
               | click something or do a certain action and suddenly I
               | can't paste anymore. I even get a feel for it, like my
               | mind detects the pattern that empties the clipboard so I
               | sense when I can no longer paste, but I can't figure out
               | concrete repeatable steps to make it happen. On iOS it's
               | more random, and I feel like it's probably Facebook doing
               | it, or maybe websites in Safari. I just assume that
               | everything is spying on my clipboard contents now, hoping
               | to log secrets/passwords and PII to sell to scammers.
               | 
               | I have to say, this is one of the more disappointing
               | developments from Apple, that they certainly must know by
               | now about these clipboard shenanigans, but have done
               | nothing to stop them. They need to implement permissions
               | that deny all apps the ability to get/set the clipboard
               | by default, and have an option to ask the user whether
               | so-and-so app can access the clipboard (outside of normal
               | copy/paste), every time with the option to allow always.
               | And all clipboard access attempts should probably get
               | logged somewhere.
        
               | jamwil wrote:
               | I think iOS now has per-app permissions/notifications
               | around clipboard reads.
        
               | nativeit wrote:
               | I would think requiring opt-in for clipboard
               | functionality would be the more radical option that would
               | leave most users (myself included, I would imagine)
               | scratching their heads when they can't copy/paste as a
               | matter of course. Maybe you meant something more
               | specifically related to 3rd-party sniffing/modifying
               | clipboard contents, but I haven't really encountered that
               | outside of apps such as CopyQ and Paste, and they are
               | pretty explicit and intentional about their functions.
               | 
               | I have found a lot of utility with cross-device
               | copy/paste. I know it requires the somewhat mysterious
               | phantom Bluetooth/Wi-Fi connectivity that AirPlay/Airdrop
               | use, so if I have disabled Bluetooth on my device, for
               | example, it will no longer work. I could see where it
               | might not be fully reliable enough to count on, I have
               | experienced inexplicable failures, not often but enough
               | to understand that it might not be some folks' default
               | preference. As part of the "handoff" function, it can be
               | disabled in Settings at least.
        
             | nomel wrote:
             | > is unexpectedly shared between my phone and computer
             | 
             | There was a prompt asking if I wanted to enable it, when I
             | set up my phone/Mac. Same setup screen that asks if you
             | want to enable location, Siri, etc.
        
             | andrei_says_ wrote:
             | For me it's one of the top benefits of the Apple ecosystem.
             | 
             | The only drawback is that yes it only works most of the
             | time. And when it doesn't I get infuriated.
             | 
             | Glitches happen without any change to settings or network
             | on my side - it works now, and 5 min later doesn't.
        
               | e28eta wrote:
               | Some of the "not working" cases may be due to the
               | application you're copying from setting the items as
               | `localOnly`, ex: from a password manager. I don't have an
               | explanation for other failures.
               | 
               | https://developer.apple.com/documentation/uikit/uipastebo
               | ard...
        
               | comprev wrote:
               | Integration is the primary reason I enjoy using Apple
               | ecosystem. My phone, laptop, tablet and watch all work
               | seamlessly together.
               | 
               | I use most of Apple's "built in" applications like Mail,
               | Notes, Photos, etc. with Firefox (instead of Safari)
               | probably the only exception to that.
        
               | devilbunny wrote:
               | It's wonderful when it works. For reasons beyond my
               | comprehension, the Watch unlock for my Mac only works
               | ~10% of the time.
        
             | emmjay_ wrote:
             | Disabling Handoff is currently the only way to disable
             | Universal Clipboard.
             | 
             | * Mac: Go to System Preferences > General > uncheck Allow
             | Handoff.
             | 
             | * iPhone: Go to Settings > General > Handoff > uncheck
             | Handoff.
        
         | escot wrote:
         | I use the following to edit contents of my clipboard:
         | pbpaste | vipe | pbcopy
         | 
         | Where vipe is a util for inserting your editor (vim) in the
         | middle of a pipe. From: https://joeyh.name/code/moreutils/
        
         | ksala_ wrote:
         | Since you mention both pbcopy and iTerm - I love
         | https://github.com/skaji/remote-pbcopy-iterm2. I do most of the
         | work on a remove Linux server, treating my MacBook as mostly a
         | dumb terminal, and being able to transparently copy from the
         | remove to my local clipboard is so nice.
        
           | tstack wrote:
           | The tmux integration in iterm is also very nice for remote
           | work if you haven't tried it out.
        
             | ksala_ wrote:
             | I have tried it, but for whatever reason I just don't like
             | it. I prefer just running tmux in iTerm with no
             | integration.
             | 
             | On the topic, you can also integrate tmux with the native
             | clipboard - I have set copy-pipe to the remote pbcopy, so
             | any selection done in tmux get copied to my local
             | clipboard. I also just found out that tmux also support it
             | natively (https://github.com/tmux/tmux/wiki/Clipboard#the-
             | set-clipboar...).
        
           | whartung wrote:
           | I'll have to try that. More than once I've been logged in to
           | a remote host and got "pbcopy not found" "What!?... oh,
           | right."
        
         | lkbm wrote:
         | Oh man. I recently threw together a "j2p" script to make
         | converting between json and python dicts simpler, and combining
         | it with pbcopy/pbpaste will make it so much better:
         | #!/usr/bin/env python3       import sys       import json
         | print(json.load(sys.stdin))
        
           | atoav wrote:
           | Or directly from the commandline:                   pbcopy |
           | python -c 'import sys; import json;
           | print(json.load(sys.stdin))' | pbpaste
        
         | flaminHotSpeedo wrote:
         | Also a fun one to combine with `open` if you have a bunch of
         | web URLs to open
        
         | eddieroger wrote:
         | I don't remember when I learned about these, but they've been
         | game changers, and everyone I've shared them with feels the
         | same way. I use your use case often as well, though through
         | `jq` because I'm more familiar with it, and sometimes wish to
         | do transforms.
        
           | nerdponx wrote:
           | You can use `python -m json.tool` for just JSON formatting,
           | which is convenient now that Python is available by default
           | in most Linux distros. Jq is really excellent though.
        
         | omginternets wrote:
         | If I had a nickel for each `cat foo.json | jq | pbcopy`, I'd be
         | a rich man :)
        
           | maleldil wrote:
           | That's a useless use of cat. You can use `jq . foo.json |
           | pbcopy` or `jq < foo.json | pbcopy`.
        
             | cratermoon wrote:
             | https://porkmail.org/era/unix/award
        
             | [deleted]
        
             | nicky0 wrote:
             | In what way do you see those alternatives as superior?
        
               | paulddraper wrote:
               | They avoid an unnecessary invocation of the cat
               | executable.
               | 
               | Instead, they open a file descriptor and pass that.
               | 
               | Tiny difference but there you go.
        
               | omginternets wrote:
               | >They avoid an unnecessary invocation of the cat
               | executable.
               | 
               | And ... ?
        
               | adrianmonk wrote:
               | Not just that, but also all the bytes have to go through
               | an extra pipe. Presumably they're copied an extra time
               | because of this.
               | 
               | When you run "cmd < file", the command reads from stdin,
               | which pulls directly from the file. When you do "cat file
               | | cmd", "cat" opens the file, reads from there, and
               | writes to a pipe. Then "cmd" reads from its stdin, which
               | is a pipe.
        
               | latexr wrote:
               | To add, searching for "useless use of cat" will yield
               | several results for those interested in learning more.
               | Other examples include "useless use of echo" and "useless
               | use of ls *".
        
               | wpm wrote:
               | I teach shell scripting. Cat invocations are cheap and
               | help learners understand and keep clear where input is
               | coming from, and where it is going. There are no awards
               | or benefits to reducing the number of lines, commands
               | invoked, or finding the shortest possible way to perform
               | a task in a script. There are plenty of detriments to
               | reading and understanding though when we try to obfuscate
               | this to save 1ms of execution time on a script that is
               | going to execute near instantaneously anyways.
               | 
               | In short, I straight up don't care.
        
               | revscat wrote:
               | I 100% agree with you. My only defense of OP is that `<`
               | is something tends to be forgotten. Like everyone else in
               | this thread I go to `cat` first for things like this. But
               | sometimes I forget that even `<` exists, and the callout
               | is a nice reminder.
        
               | derefr wrote:
               | If the command is meant to stream through something
               | _really fast_ by using a large buffer size, then
               | prepending a cat(1) will limit the incoming buffer size
               | to ~4k.
        
               | gdavisson wrote:
               | It usually doesn't matter much, but there are some
               | situations where it can matter a lot. For one thing, you
               | can't use seek() on a pipe, so e.g. `cat bigfile | tail`
               | has to read through the entire file to find the end, but
               | `tail bigfile` will read the file backward from the end,
               | completely skipping the irrelevant beginning and middle.
               | With `pv bigfile | whatever`, pv (which is basically a
               | pipeline progress indicator) can tell how big file is and
               | tell you how for through you are as a percentage; with
               | `cat bigfile | pv | whatever`, it has no idea (unless you
               | add a flag to tell it). Also, `cat bigfile | head` will
               | end up killing cat with a SIGPIPE signal after head
               | exits; if you're using something like "Unofficial bash
               | strict mode" [1], this will cause your script to exit
               | prematurely.
               | 
               | Another sometimes-important difference is that if there
               | are multiple input files, `somecommand file1 file2 file3`
               | can tell what data is coming from which file; with `cat
               | file1 file2 file3 | somecommand` they're all mashed
               | together, and the program has no idea what's coming from
               | where.
               | 
               | In general, though, I think it's mostly a matter of
               | people's expertise level in using the shell. If you're a
               | beginner, it makes sense to learn one very general way to
               | do things (`cat |`), and use it everywhere. But as you
               | gain expertise, you learn other ways of doing it, and
               | will choose the best method for each specific situation.
               | While `cat |` is usually an ok method to read from a
               | file, it's almost never _the best_ method, so expert
               | shell users will almost never use it.
               | 
               | [1] http://redsymbol.net/articles/unofficial-bash-strict-
               | mode/
        
             | jdbartee wrote:
             | Speaking for myself, the first form is more natural- even
             | if it's a useless cat, because I'm always cat-ing files to
             | see their structure. Then progressively tacking on
             | different transforms. And then finally putting it in
             | whatever I want as output.
             | 
             | It's so ingrained, I'm more likely than not to just write
             | it out that way even when I know exactly what I'm doing
             | from the onset.
        
               | fastaguy88 wrote:
               | As a scientist who cares about reproducibility, the big
               | difference between the "useless cat" and providing the
               | input file name on the command line is that, in the
               | latter case, the program can capture that file name and
               | reproduce it. That is harder when using stdin.
               | 
               | Many of my programs and scripts start output with the
               | line: # cmd arg1 arg2 arg3 ...
               | 
               | and simply echo back lines that start with '#'. That way,
               | I have an internal record of the program that was run and
               | the data file that was read (as well as previous parts of
               | the analysis chain).
               | 
               | And, 'R' ignores lines starting with '#', so the record
               | is there, but does not affect later analyses.
        
               | paulddraper wrote:
               | You could consider                   < foo.json jq |
               | pbcopy
        
               | jamespullar wrote:
               | I've been using bat as a cat replacement for a while now.
               | It includes paging, syntax highlighting, line numbers,
               | and is generally very performant.
               | 
               | https://github.com/sharkdp/bat
        
               | patrec wrote:
               | If you're using zsh, you can just replace any instance of
               | $ cat somefile ...
               | 
               | with                   $ <somefile ...
               | 
               | For bash, this only works if you have at least one `|`.
        
               | jonnycomputer wrote:
               | Yes, this iterative procedure is often why "useless" cats
               | get put into it. It's a very effective way of processing
               | regular text information.
               | 
               | e.g.
               | 
               | I need to grab some info from textfile.txt to use as
               | arguments to a function.
               | 
               | cat textfile.txt
               | 
               | looks like its comma delimited.
               | 
               | cat textfile.txt | cut -d, -f 2-5
               | 
               | ah, its the third and fourth column i need
               | 
               | cat textfile.txt | cut -d, -f 3-4 | grep '123456'
               | 
               | perfect
               | 
               | cat textfile.txt | cut -d, -f 3-4 | grep 123456 | tr , '
               | '
               | 
               | myfunc $(cat textfile.txt | cut -d, -f 3-4 | grep 123456
               | | tr , ' ')
        
               | gumby wrote:
               | > cat textfile.txt
               | 
               | > looks like its comma delimited.
               | 
               | Interesting; why wouldn't you use `head`? Who knows how
               | big textfile.txt is?
        
               | rovr138 wrote:
               | `file` will tell you too
        
               | jonnycomputer wrote:
               | Won't tell you the delimiter.
        
               | [deleted]
        
               | yrro wrote:
               | Don't forget to pipe head into 'cat -v'... that text file
               | could contain _anything_!
        
               | gunapologist99 wrote:
               | Thank you for pointing this out! This is much safer.
        
               | lelandbatey wrote:
               | I really recommend folks use "less" over cat, especially
               | keyboard oriented folks. Different terminal emulators
               | don't always have the scroll behavior I want, not do they
               | always allow me to search the file I'm looking at. "less"
               | does all those things, in nearly every environment no
               | matter the terminal emulator, and has other wonderful
               | options to boot (chop long lines so they don't wrap can
               | be nice for logs, line numbers can be VITAL, etc).
               | 
               | I still uselessly use cat though, it's such a nice way to
               | build a pipeline.
        
               | jmhammond wrote:
               | My useless cat is that I always use `cat file | less`
               | when I could just `less file`.
               | 
               | I've been typing cat for over 25 years. Old habits die
               | hard.
        
               | jonnycomputer wrote:
               | generally, speaking, if you don't have an idea of how big
               | the file is, or it would take up too much real-estate on
               | your terminal window, sure. 100%. It was just an example.
               | 
               | lot's of times we sort of know what we are working with,
               | but don't remember the particulars especially
        
             | nojs wrote:
             | The "useless cat" meme needs to die. Everyone is aware that
             | most commands accept a file argument, but looking up the
             | arguments and their ordering is annoying and using cat for
             | things like this is just fine.
        
               | burnished wrote:
               | Everyone is not aware, new people are joining all the
               | time.
        
               | epcoa wrote:
               | The redirect always works though - that is not a program
               | argument, that is handled by the shell. Apparently not
               | everyone is aware of that.
        
               | hdb2 wrote:
               | granted, it is a little snarky and maybe the snark isn't
               | appropriate in today's tech environment. but no, things
               | like "useless use of cat" do not need to go away, because
               | they make me better at what I do in little ways. those
               | little ways add up over time.
               | 
               | > but looking up the arguments and their ordering is
               | annoying
               | 
               | you seem to be arguing for complacency. taking your idea
               | to an extreme, why learn to do _anything_ well?
        
               | omginternets wrote:
               | This. "Useless cat" is more useful than "useless file-
               | arg".
        
             | Someone wrote:
             | Is there any shell that has _cat_ as a built-in?
             | 
             | Such a shell could remove some of the more common cases.
        
               | hnlmorg wrote:
               | All of them do. Including bash. It's just not the same
               | syntax (ie '< filename').
               | 
               | But I honestly think people who try to optimise away
               | 'cat' are optimising the wrong thing. If one extra fork()
               | is that detrimental then don't use a shell scripting
               | language.
               | 
               | For a lot of people, "useless" 'cat' enables them to
               | write a pipeline in the order that their brain farts out
               | the requirements for the pipeline. So they've optimised
               | for human productivity. And given the human brain is
               | slower than a few extra fork()s, I think optimising for
               | one's brain makes more sense here.
        
               | Someone wrote:
               | > All of them do. Including bash.
               | 
               | Are you sure?
               | https://unix.stackexchange.com/questions/208615/is-cat-a-
               | she... disagrees and neither
               | https://manpages.ubuntu.com/manpages/jammy/man7/bash-
               | builtin... nor
               | https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-
               | Command... mention it
        
               | hnlmorg wrote:
               | Literally the next sentence after the one you quoted
               | explains my point:
               | 
               | > It's just not the same syntax (ie '< filename').
               | 
               | Reading from a file isn't a hard problem. Having a good
               | UX for doing that is where most shells fall apart. And
               | that's basically what 'cat' offers here: an improved UX.
               | 
               | Having 'cat' as a shell builtin wouldn't really solve the
               | complaints raised by "useless use of" anyway because
               | you'd still be piping (and in some cases, fork()ing too).
               | You couldnt really use 'cat' as syntactic sugar for '<'
               | because things start to get really weird if you want to
               | pass flags to 'cat' or even redirect the output to
               | something other than a pipe. And given 'cat' is POSIX (ht
               | tps://en.m.wikipedia.org/wiki/List_of_Unix_commands#/medi
               | a...) the current behaviour of shells is, in my opinion,
               | correct. This is why my own shell has a differently named
               | builtin that approximately serves the purpose of 'cat'
               | but for instances when you need the command built into
               | the shell and it can't just be passing a file handle to
               | the next command (in my case, because i wanted to pass
               | metadata out-of-band as well as the file contents)
        
         | cancerhacker wrote:
         | alias pbg='pbpaste | fgrep --color -i "`pbpaste -pboard find`"'
         | 
         | select all in a terminal window with pages of log data and
         | cmd-c copy; find the one phrase you want to find in that data
         | and cmd-e to put it in the find pasteboard; cmd-n new window,
         | type pbg to isolate the log lines.
        
           | philsnow wrote:
           | TIL about named pasteboards https://developer.apple.com/docum
           | entation/appkit/nspasteboar...
           | 
           | I recognize that your pbg alias works for pretty much any
           | text you could copy, but I wanted to mention, in case you're
           | looking at log files with plain old less, there's the &
           | limiter, which limits the current view to only lines matching
           | a regular expression (or, if you type ^R during a & prompt,
           | for a text match).
           | 
           | If you type ^N or ! during a & prompt it will limit the view
           | to those lines that do not match the expression.
           | 
           | These view limits stack, so you can "&WARN<enter>" to see all
           | lines that have WARN in them, and then maybe you want to see
           | just a certain PID so "&12345<enter>" and you'll only see
           | lines with both WARN and 12345, but then that one module is
           | printing out a bunch of messages you think are safe to ignore
           | so you do "&!modulename<enter>" and it filters out log lines
           | that match modulename. Very handy and less is everywhere.
        
         | itslennysfault wrote:
         | Where are you pasting the pretty json to view it?
         | 
         | I do this a lot as well, but just paste the minified json
         | directly into VS Code and then OPT+SHIFT+F to format it.
        
           | nicky0 wrote:
           | `jq` acts as a pretty json viewer (among other things)
        
         | kps wrote:
         | On Linux I have these wrap xsel or xclip, and likewise open to
         | xdg-open.
         | 
         | Now, for your Mac example -- if that's a specific pipeline you
         | often use, you can write a Service menu entry to do it in
         | place, without switching to a terminal.
        
           | andelink wrote:
           | +1 to the service menu actions. They are so handy, but often
           | forgotten/overlooked. I think maybe a discoverability issue.
        
         | renewiltord wrote:
         | Use the Apple shortcuts app and you can just copy some text and
         | hit a keyboard shortcut. The Shortcuts app lets you run
         | arbitrary shell command.
        
           | philsnow wrote:
           | This is interesting, thank you. I've been automating various
           | things with Hammerspoon but (I think) it's limited to what
           | you can reach with either a11y or osascript / the NS
           | dictionary for the app you want to manipulate, but Shortcuts
           | seems to have some actions that aren't in the NS dictionary.
           | 
           | For instance, in Shortcuts, I see that there's a "Pin Notes"
           | action for Notes.app, but I don't see anything for pinning
           | notes when I open Notes.app with "File -> Open Dictionary..."
           | in Script Editor.
           | 
           | (In this case it's likely that Notes.app has the a11y bits
           | necessary to run that action from Hammerspoon, but it would
           | probably be easier to go through Shortcuts.)
        
         | pmarreck wrote:
         | I have linux/macos-agnostic bash functions in my dotfiles that
         | unify this to "clip" and "paste" (since "copy" is too close
         | semantically to "cp")
        
           | kps wrote:
           | paste(1) is a POSIX standard utility, though (going back to
           | System III), pairing with cut(1).
           | 
           | https://pubs.opengroup.org/onlinepubs/9699919799/utilities/p.
           | ..
        
             | vram22 wrote:
             | The Unix join command is also useful:
             | 
             | https://en.m.wikipedia.org/wiki/Join_(Unix)
        
           | svieira wrote:
           | And I have one that unifies _both_ to `clip` so you can put
           | the same command in both sides of the pipe, e. g. to turn a
           | line-delimited blob on your clipboard to a space-separated
           | one:                   clip | tr '\n' ' ' | clip
           | 
           | https://github.com/svieira/dotfiles/blob/a3654d6a194e3689978.
           | ..                   # Use clipboard in shell pipelines
           | # clip | xargs echo           # uses pbpaste         # ps -A
           | | grep search | clip  # uses pbcopy         clip() {
           | [ -t 0 ] && pbpaste || pbcopy         }
        
       | efitz wrote:
       | Someone should turn this HN discussion into a gist.
        
         | llimllib wrote:
         | here's my notes from reading the comments:
         | https://notes.billmill.org/computer_usage/mac_os/mac_os_comm...
        
       | prvc wrote:
       | What it really needs is a way to prevent sleeping when the lid is
       | closed (only) during a system update.
        
       | simscitizen wrote:
       | dtrace and the DTrace Toolkit scripts are also quite useful for
       | understanding and debugging things, e.g. `opensnoop -a` to print
       | the result of all open syscalls on the system.
        
       | maxfurman wrote:
       | I remember Caffeine used to be a third-party program that would
       | prevent your Mac from sleeping, same behavior as the `caffeinate`
       | here. Were they acquired and incorporated into the OS?
        
         | coldtea wrote:
         | Caffeine was a front-end by a third party company. Used it back
         | in the day, the command existed already though.
         | 
         | Since then I've moved to Amphetamine (same purpose menu-bar
         | app, even stronger chemicals, has timed keep-awake etc).
        
         | LanceH wrote:
         | Anyone know of a Ubuntu on WSL equivalent?
        
           | [deleted]
        
           | redacted wrote:
           | https://learn.microsoft.com/en-us/windows/powertoys/awake to
           | keep Windows itself awake?
        
         | alexdbird wrote:
         | I believe that Caffeine was a fairly simple GUI wrapper for the
         | existing caffeinate command
        
           | emodendroket wrote:
           | Yes. There is a similar product called Amphetamine now.
        
         | meepmorp wrote:
         | It's been cli util on macos for 10+ years. I remember a gui
         | util called caffeinated, though.
        
       | riobard wrote:
       | For audio there're also `afinfo` to probe metadata and
       | `afconvert` to convert between different codec/container formats.
       | I use them for podcast post-processing and archiving workflow.
       | 
       | macOS 13 Ventura ships with a customized `iperf3` called
       | `iperf3-darwin` adding features like QUIC/L4S/MPTCP.
        
         | Alifatisk wrote:
         | QUIC already? Cool
        
       | Jayakumark wrote:
       | [flagged]
        
         | saurabhsharan wrote:
         | Hi, author of the post here. No part of this post was generated
         | via ChatGPT (or any other AI). I had been maintaining my own
         | list of commands I've used over the years and decided to
         | publish it on my website.
        
       | RandallBrown wrote:
       | The say command has one of my favorite pieces of that famous
       | Apple polish.
       | 
       | If you type `say os x`, it'll actually speak "oh es ten".
        
         | unsupp0rted wrote:
         | It says "oh es ex" for all variations I've tried
        
           | _diyar wrote:
           | Capitalizing the phrase made it work for me
           | 
           | > say OS X
           | 
           | Edit: Late 2016 MBP on 12.6.6 Monterey
        
           | rootusrootus wrote:
           | Interesting. Says 'OS 10" on my Ventura 13.4 macbook.
        
       | fredoralive wrote:
       | I'll go for the somewhat obsolete `drutil eject` as Mac OS can be
       | sometimes rather reluctant to eject cycle optical drives if it
       | doesn't actually think a disc in in them. Although nowadays
       | you'll probably be using a 3rd party tray load drive with an
       | eject button instead of a no-button slot loading Apple one.
        
       | babbledabbler wrote:
       | say --rate=500 "Peter Piper picked a peck of pickled peppers. A
       | peck of pickled peppers Peter Piper picked. If Peter Piper picked
       | a peck of pickled peppers, Where's the peck of pickled peppers
       | Peter Piper picked?"
        
       | pseufaux wrote:
       | Not a bad list of basic macOS specific cli tools. For a more in
       | depth list, I usually reference https://ss64.com/osx/.
        
         | latexr wrote:
         | A tad outdated. At a glance I see it's missing `networkQuality`
         | (introduced in Monterey) and `realpath` (added in Ventura).
        
           | pseufaux wrote:
           | Agreed. Some of the flags are missing as well. Not sure it's
           | updated often, but still not a bad starting point. If only
           | Apple would publish something directly. They do a pretty good
           | job with the Apple Platform Deployment guide
           | (https://support.apple.com/guide/deployment). And the
           | Security guide (https://support.apple.com/guide/security).
        
             | thefilmore wrote:
             | I maintain updated lists here:
             | 
             | https://manp.gs/mac/1/
             | 
             | https://manp.gs/mac/8/
        
               | pseufaux wrote:
               | That's awesome. Bookmarked for later!
        
       | louzell wrote:
       | opensnoop is also a good one that usually stays under the radar
        
       | apozem wrote:
       | I love pbcopy and miss it every time I ssh into my Raspberry Pi.
       | Should be included in every shell environment as standard.
        
         | pqb wrote:
         | Isn't there `xsel` or `xclip` installed instead [0]? These two
         | commands are commonly used on the Linux boxes and they support
         | pipes too. For example, the xclip is used by the original
         | password-store implementation [1].
         | 
         | On [2] you might find the aliases to pbutil for X11-based
         | Linuxes.
         | 
         | [0]: If not, why not run apt-get command to install one of
         | them, like xclip?
         | 
         | [1]: https://git.zx2c4.com/password-store/tree/src/password-
         | store...
         | 
         | [2]: https://ostechnix.com/how-to-use-pbcopy-and-pbpaste-
         | commands...
        
       | gemstones wrote:
       | qlmanage is super useful for converting SVG to PNG easily, too! I
       | use it like this:
       | 
       | qlmanage -t -s 1000x1000 -o ~/Pictures/foo.png ~/Pictures/foo.svg
       | 
       | To turn an square SVG into a PNG without installing anything
       | extra or using an online image tool
        
       | varispeed wrote:
       | Interesting so many useful commands, but they didn't have time to
       | fix basics like scroll wheel, so you have to install 3rd party
       | apps to set it independently from the touch pad and then it still
       | manages to swap it around at random times.
       | 
       | Am I the only one who finds macOS so annoying?
       | 
       | I mean the apps for scroll wheel, alt-tab and what not...
        
         | KyleBerezin wrote:
         | The issues I have are touch-dragging with the touchpad, and no
         | window docking. Docking I fixed by buying 'Magnet', touch
         | dragging is still annoying. They have a setting that is
         | supposed to enable 'double tap drag' like windows, but when you
         | let go, it keeps dragging for some random amount of time,
         | making it unusable.
        
           | sbuk wrote:
           | Settings > Accessibility > Pointer Control > Trackpad
           | Options...
           | 
           | Three-Finger Drag works really well and is surprisingly easy
           | to get used to doing.
        
       | reaperducer wrote:
       | One I use a lot: mdls.
       | 
       | It's ls for metadata. Very helpful for getting quick and scripted
       | access to the date/time when and the latitude/longitude where a
       | photograph was taken.
       | 
       | Also, the say command is a lot more versatile than it seems.
       | 
       | Combined with the ability to save the speech to an audio file, my
       | wife uses it as the disc jockey for her little hobby AM radio
       | station. It introduces the song and does little station IDs and
       | such.
       | 
       | You can customize it with dozens of dozens of voices, some in
       | very high quality.
       | 
       | When a song from her Japanese playlists comes on, it switches to
       | one of the Japanese voices. I don't speak Japanese, so I don't
       | know if it actually translates the DJ words into Japanese, but it
       | sounds pretty close to my untrained ears.
        
       | api wrote:
       | Here are my favorites:                   alias sleepoff="sudo
       | pmset -a disablesleep 1"              alias sleepon="sudo pmset
       | -a disablesleep 0"
       | 
       | This fully disables sleep, period. Just make sure you don't leave
       | it unplugged too long, but on Apple Silicon it lasts for quite a
       | long time.
        
         | kec wrote:
         | this is just a worse version of caffeinate which is more likely
         | to leave you with a dead battery.
        
       | juujian wrote:
       | Is ```textutil -convert``` using pandoc under the hood?
        
         | secretsatan wrote:
         | I thought pandoc used to be installed on MacOS, I def remember
         | using it for something useful a couple of years ago but I check
         | now and it's not there.
        
         | kainjow wrote:
         | IIRC it's using the Cocoa class NSAttributedStrimg. These
         | conversions have been in the OS for a long time.
        
       | lastangryman wrote:
       | I find it extremely upsetting that `networkQuality` is the only
       | command that is not entirely lowercase. How did this get through
       | PR??
        
         | 1f60c wrote:
         | APFS isn't case-sensitive, so you can type networkquality if it
         | makes you happy. :-)
        
           | andelink wrote:
           | Wow, truly a pro tip, thank you!
        
       | shortrounddev2 wrote:
       | While you're at it, `brew install coreutils`. The coreutils that
       | ship with macOS lack a lot of features available on Linux. If you
       | use bash, I recommend upgrading it, too, since Apple ships a 16
       | year old build (iirc due to legal issues associated with GPLv3)
       | `brew install bash`
        
         | lloeki wrote:
         | They come from BSD (and, nitpick, are not called coreutils).
         | These BSD tools lack features mostly only if you're used to GNU
         | coreutils.
         | 
         | The expanse of GNU coreutils features is questionable too: some
         | are nice, some you can do without easily and rarely to never
         | miss, and some are downright annoying (yes I'm looking at you,
         | ls with colors+quotes)
        
           | shortrounddev2 wrote:
           | Obviously everything is preference, but I prefer things like
           | expanded regex in gnu grep to the underpowered macOS utils
        
             | alwaysbeconsing wrote:
             | GNU and BSD grep both default to "basic" regular
             | expressions and both have the `-E` switch to use "extended"
             | expressions.
        
               | shortrounddev2 wrote:
               | Last time I used macOS (which was 6 years ago) there was
               | no extended expressions, or the regex syntax was limited.
               | I forget (again, haven't used an apple product in years)
        
               | alwillis wrote:
               | It's not necessary to install a suite of commands if you
               | want updated grep.
               | 
               | Just use Homebrew and you can install different versions
               | of grep, including GNU's:                   brew install
               | grep
        
               | shortrounddev2 wrote:
               | Sure but with this you get all the other improved core
               | utils like sed, etc. GNU utils just blow BSD/macOS out of
               | the water. Personally, macOS seems to me like a half
               | baked development platform in general
        
         | Finnucane wrote:
         | They're shipping zsh now.
        
           | latexr wrote:
           | macOS has shipped Zsh for a long time. The difference is that
           | now (since Catalina), it's the default shell.
        
           | jonnycomputer wrote:
           | I've found the transition to zsh surprisingly painless. But
           | then, I do most of my command line scripting on linux and not
           | my own machine. But still.
        
           | shortrounddev2 wrote:
           | That's why I said "if you use bash"
        
         | [deleted]
        
       | nomilk wrote:
       | Surprised pngpaste isn't mentioned (in the article nor the
       | comments).
       | 
       | If you take a screen shot (command + shift + 4) or partial screen
       | shot (command + shift + control + 4) you can save it directly to
       | an image file with:
       | 
       | pngpaste filename.png
        
         | lkuty wrote:
         | I configured the screenshot to file to automatically save them
         | to ~/Desktop/screenshots instead of ~/Desktop using the
         | Screenshot app to avoid cluttering the desktop. See
         | https://www.hellotech.com/guide/for/how-to-change-where-scre...
        
         | pier25 wrote:
         | Both commands you listed take a partial screenshot. The first
         | one saves it to the desktop and the second one (with control)
         | to the clipboard.
        
           | nomilk wrote:
           | Oops, you're right. I meant command + shift + control + 3
           | (full screen to clipboard) and command + shift + control + 4
           | (partial screen to clipboard).
        
         | agos wrote:
         | command shift 4 already saves a file, maybe you were thinking
         | about command + shift + control + 3?
        
           | filoleg wrote:
           | IIRC Cmd+shift+4 by default stores to a file, but it is
           | easily changeable in settings. Mine has been set to store to
           | clipboard since a long time ago (since i mostly ever take
           | them to send to someone in chat or to insert into my own
           | notes, for which clipboard is exactly what i need).
           | 
           | To change it: open Screenshot app (either cmd+shift+5 or from
           | the app launcher), click Options in the center bar, and set
           | "Save to" to "clipboard". Now, all screenshots in the future
           | will be going by default to clipboard. You can also pick many
           | other destinations for saving, including any arbitrary
           | directory or many other apps (e.g., mail, preview, etc.).
           | 
           | After some googling TIL, apparently if you use Ctrl key
           | modifier with any screenshot shortcuts (cmd+shift+3/4), it
           | will store to clipboard regardless of your setting. Kinda
           | nifty for those who switch between storing to file/clipboard
           | all the time.
        
             | eppsilon wrote:
             | You can also right-click the screenshot thumbnail to save
             | to clipboard or some other location on a one-off basis.
        
             | doctor_eval wrote:
             | You can also use shift-cmd-5 to frame the page and then
             | cmd-c to copy the screenshot - regardless of the screenshot
             | app settings.
        
         | latexr wrote:
         | `pngpaste` doesn't ship with macOS. All the tools in the
         | article do.
        
       | msie wrote:
       | json_pp
        
       | pantulis wrote:
       | powermetrics gives a lot of energy usage info per CPU core and
       | apps.
        
       | atarv wrote:
       | If you need a more featureful alternative to textutils, look for
       | pandoc https://github.com/jgm/pandoc
        
         | dredmorbius wrote:
         | A strong second to this, it was going to be my own comment ;-)
        
       | reacharavindh wrote:
       | Is there any easy shortcut to resizing an image by percentage or
       | fitting to a specific size?
       | 
       | Many a times, a website says "file needs to be no bigger than 2
       | MB", and I need to scramble with Preview app to resize teh app
       | until it falls below that limit. A cli tool for that action would
       | be very handy.
        
         | itake wrote:
         | I typically use
         | https://www.digitalocean.com/community/tutorials/workflow-re...
         | 
         | You can even do bulk cmds with cli on images:
         | for x in ls *.webp; do  ffmpeg -i $x ${x%.webp}.png; done
         | 
         | reformats images from webp to png in a directory.
         | magick mogrify -monitor -format jpg *.png -compress 70
         | 
         | reformats and compresses pngs to be jpg in a directory
        
         | jiripospisil wrote:
         | You can use ImageMagick's `convert`.                 convert
         | original.jpg -define jpeg:extent=2MB output.jpg
         | 
         | The result will be around 2MB in size (in both directions).
        
       | [deleted]
        
       | bovermyer wrote:
       | I just freaked out my cat using `say`. I'm going to enjoy this
       | too much.
        
         | ubermonkey wrote:
         | YEARS ago, when my nephew was young, he was playing with my
         | mother's Macbook Air at Thanksgiving.
         | 
         | I administer that machine for her (to the extent that such a
         | thing is needed), and so I knew (a) her login and (b) that SSH
         | was open.
         | 
         | Me combining remote access with "say" made for a very memorable
         | morning for that kid.
        
         | tmearnest wrote:
         | I used to work at a 24 hr end user tech support call center.
         | They didn't use Macs, but we had a machine for the techs to use
         | to understand what the customer is looking at. I wrote a script
         | to sleep until late at night then start saying weird/creepy
         | stuff to mess with the overnight crew.
        
         | bendecoste wrote:
         | Combined with the `yes` command is very good fun ;)
        
         | gen_greyface wrote:
         | try it out with different voices, for starters try
         | say "process failure" -v trinoids
         | 
         | you can find all the available voices with                 say
         | -v '?'
         | 
         | or from Accessibility>Spoken-Content>System-voice>Manage-voices
        
           | robertoandred wrote:
           | We must rejoice in this morbid voice.
        
           | memco wrote:
           | A nice feature I discovered recently is -a: you can give it a
           | specific audio device, which falls back to the default if not
           | present. I use it to report when builds finish through my
           | monitor speakers in case I'm not wearing headphones. If I'm
           | on the go and don't have the monitor connected it plays
           | through the speakers.
        
           | mesarvagya wrote:
           | I liked the option of using `-v organ`
        
         | [deleted]
        
         | [deleted]
        
       ___________________________________________________________________
       (page generated 2023-06-27 23:00 UTC)