macOS screenshot settings (com.apple.screencapture) support either target = clipboard (clipboard only, no file) or saving to a location (file only, no clipboard). There is no native "both" option.
Solution
Set macOS to save screenshots to a folder, then use a launchd agent with WatchPaths to auto-copy each new screenshot to the clipboard.
1. Set screenshot target to file
defaults write com.apple.screencapture location ~/Pictures/Screenshots
defaults delete com.apple.screencapture target # removes clipboard-only modeCritical: kill screencaptureui after changing defaults — it caches settings and won't re-read them until relaunched:
killall screencaptureuikillall SystemUIServer is NOT sufficient on modern macOS (Sequoia+). The screencaptureui process is separate and long-lived (runs for weeks).
2. Clipboard copy script
Place at ~/.local/bin/screenshot-to-clipboard.sh:
#!/bin/bash
sleep 0.5 # let the file finish writing
NEWEST=$(ls -t "$HOME/Pictures/Screenshots"/*.png 2>/dev/null | head -1)
[ -z "$NEWEST" ] && exit 0
osascript -l JavaScript -e '
function run(argv) {
ObjC.import("AppKit");
var data = $.NSData.dataWithContentsOfFile(argv[0]);
if (data.isNil()) return "file not found";
var pb = $.NSPasteboard.generalPasteboard;
pb.clearContents;
pb.setDataForType(data, $.NSPasteboardTypePNG);
return "ok";
}' -- "$NEWEST"Key detail: AppleScript's read ... as class PNGf is broken on modern macOS (error -1700). Use JXA with NSPasteboard.setDataForType instead.
3. launchd agent
Create a plist at ~/Library/LaunchAgents/ with:
- ProgramArguments:
/bin/bashand the absolute path to the script above - WatchPaths: the absolute path to your screenshots folder
- ThrottleInterval: 1
Load with: launchctl bootstrap gui/$(id -u) <plist-path>
Note: launchd plists require absolute paths — expand ~ to your actual home directory.
Gotchas
- Clipboard lands ~3-5 seconds after the screenshot due to WatchPaths trigger delay + osascript JVM startup + 0.5s sleep. Acceptable for most workflows.
- All native shortcuts work unchanged (Cmd+Shift+3, Cmd+Shift+4, Cmd+Shift+5 overlay).
defaults writeis not enough — you must killscreencaptureui(notSystemUIServer) for changes to take effect.