LaunchAgents zip/tar not working in plist?

I created the plist for a 'custom' backup agent (via LaunchAgent). The (zip) program is called, but I keep getting a 'zip error: Nothing to do!' in my logs.

I assume it has something todo with permissions. I did add sh and zip to my Full Disk Access security settings. But it did not help.

On a side-note, when I move the zip command in a shell (sh) script, it works.

I would like to know why using the zip command directly doesn't?

Running the command for the terminal works also without issues, like so:

/usr/bin/zip /Users/username/Backup/test.zip /Users/username/Documents/*.pdf

LaunchAgent script:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.myuser.DailyBackup</string>
    <key>Program</key>
    <string>/usr/bin/zip</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/username/Backup/test.zip</string>
        <string>/Users/username/Documents/*.pdf</string> 
    </array>    
    <key>StandardOutPath</key>
    <string>/tmp/my.backup.log</string>    
    <key>StandardErrorPath</key>
    <string>/tmp/my.backup.err</string>    
    <key>Debug</key>
    <true/>    
    <key>StartInterval</key>
    <integer>10</integer>
</dict>
</plist>

Solution 1:

From man launchd.plist

ProgramArguments <array of strings>
This key maps to the second argument of execvp(3) and specifies the argument vector to be passed
to the job when a process is spawned. This key is required in the absence of the Program key.
IMPORTANT: Many people are confused by this key. Please read execvp(3) very carefully!

So you need to use

    <key>Program</key>
    <string>/usr/bin/zip</string>
    <key>ProgramArguments</key>
    <array>
        <string>zip</string>
        <string>/Users/username/Backup/test.zip</string>
        <string>/Users/username/Documents/*.pdf</string> 
    </array>    

It still won't work though because launchd doesn't expand wildcards and zip doesn't either. It's easier to use launchd to start a shell script which does all the work then.