如何修正dockutil脚本中因应用名含not导致的Dock项判断误判
解决dockutil检测Dock应用存在性的误判问题
问题背景
刚接触dockutil工具,需要编写脚本实现以下逻辑:检查指定应用是否存在于Dock中,不存在则添加,已存在则不执行任何操作。
目前使用dockutil --find Keynote命令做检查,当应用不存在时,命令输出如下:
Keynote was not found in Keynote was not found in /Users/$UserName/Library/Preferences/com.apple.dock.plist
现有脚本通过提取输出中的"not"字符串做判断,但如果目标应用名称包含"not"(比如应用名为"NoteApp"),会导致误判,无法正确识别应用是否存在。现有脚本如下:
app='Keynote' echo "${app}" Test=$(dockutil --find "${app}" | tr ' ' '\n'| grep "not") if [[ ${Test} == "not" ]]; then echo " its not there " else echo "its there" fi
修正方案
方案1:利用dockutil的退出码(推荐)
dockutil --find命令本身会返回明确的退出码:
- 应用存在时,退出码为0
- 应用不存在时,退出码为非0(通常是1)
直接通过退出码判断,无需解析输出,完全避免应用名称带来的误判。修正后的脚本:
app='Keynote' # 静默执行find命令,丢弃所有输出 if dockutil --find "${app}" > /dev/null 2>&1; then echo "${app} 已存在于Dock中" else echo "${app} 不在Dock中,开始添加..." # 替换为你的应用实际路径 dockutil --add "/Applications/${app}.app" # 添加后重启Dock使更改生效 killall Dock fi
方案2:匹配完整的"not found"短语
如果一定要通过解析输出来判断,可以匹配完整的"not found"短语,而不是单独的"not",避免应用名称中的"not"干扰。脚本示例:
app='Keynote' # 获取命令输出 output=$(dockutil --find "${app}") # 静默匹配"not found"短语 if echo "${output}" | grep -q "not found"; then echo "${app} 不在Dock中,开始添加..." dockutil --add "/Applications/${app}.app" killall Dock else echo "${app} 已存在于Dock中" fi
内容的提问来源于stack exchange,提问作者Albert Chan
相关产品推荐
相关产品推荐

