You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何zsh脚本单独运行正常,被launchd调用时报no matches found错误

问题根源

该错误是zsh默认配置导致的:zsh默认开启了NOMATCH选项,当通配符*没有匹配到任何文件时,会直接抛出no matches found错误终止脚本运行,不会像bash一样将未匹配的通配符直接作为参数传给命令。
你手动运行脚本时目标文件夹内有文件,通配符可以正常匹配所以运行成功;launchd定时调用时如果刚好文件夹内没有文件,就会触发该错误。

解决方案

方案1:调整zsh通配符匹配规则

在你的deleteGCODE.sh脚本开头添加setopt null_glob配置,该配置会让zsh在通配符无匹配时自动移除该参数,不会抛出错误:

#!/bin/zsh
setopt null_glob
dir="/Users/simon/Documents/Simplify3D/GCODE/"
# 通配符后加(N)也可以临时开启单次null_glob效果,不需要全局配置
# rm -rf "$dir"*(N)
rm -rf "$dir"*

方案2:改用find命令实现(更稳妥,优先推荐)

直接放弃通配符写法,用find命令执行删除,不管文件夹是否为空都不会报错,兼容性更好:

#!/bin/zsh
dir="/Users/simon/Documents/Simplify3D/GCODE/"
# -mindepth 1避免删掉GCODE文件夹本身,只删除内部所有内容
find "$dir" -mindepth 1 -delete

额外生效检查项

  1. 确认脚本有可执行权限:运行sudo chmod +x /usr/local/bin/deleteGCODE.sh
  2. 你的plist配置中Label值建议改为com.deleteGCODE,不需要带.plist后缀,避免后续加载服务时出现命名冲突
  3. 修改完配置后需要重新加载launchd服务生效:
sudo launchctl unload /Library/LaunchDaemons/com.deleteGCODE.plist
sudo launchctl load /Library/LaunchDaemons/com.deleteGCODE.plist
  1. 全局LaunchDaemons默认以root身份运行,需要确认root有权限访问目标目录:可在「系统偏好设置 - 安全性与隐私 - 隐私 - 完全磁盘访问权限」中确认/usr/sbin/launchd已被添加到允许列表中。

内容的提问来源于stack exchange,提问作者Miracuru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 15:57:02