macOS下如何将Shell变量中的路径列表传入GNU updatedb选项?
解决macOS下GNU updatedb传递$PRUNEVOLS变量的问题
核心问题
你之前的调用失败,本质是shell变量展开时的空格拆分问题:当$PRUNEVOLS以空格分隔存储路径时,直接传递会被shell拆分成多个独立参数,而updatedb需要--prunepaths后面接收一个完整的、包含空格分隔路径的字符串参数。
直接修复的调用方式
如果保留当前$PRUNEVOLS的初始化方式,只需用双引号包裹--prunepaths的参数值,确保变量正确展开且作为整体传递:
updatedb --localpaths='/' --prunepaths="/System $PRUNEVOLS"
更安全的初始化+调用方案
原ls + grep的初始化方式在路径包含空格时会出错(比如/Volumes/My First Vol会被拆分成多个片段),建议改用数组存储路径,再拼接成字符串:
# 初始化数组,排除/Volumes/IndexMe PRUNEVOLS=() for vol in /Volumes/*; do [[ "$vol" != "/Volumes/IndexMe" ]] && PRUNEVOLS+=("$vol") done # 将数组转为空格分隔的字符串,包含/System PRUNEPATH_LIST="/System ${PRUNEVOLS[*]}" # 正确调用updatedb updatedb --localpaths='/' --prunepaths="$PRUNEPATH_LIST"
为什么之前的方式失败?
- 若用单引号包裹参数:
--prunepaths='/System $PRUNEVOLS',单引号会阻止shell解析变量,$PRUNEVOLS会被当成字面字符串传递。 - 若不包裹直接传递:
--prunepaths=/System $PRUNEVOLS,$PRUNEVOLS里的每个路径会被shell拆分成独立参数,updatedb会把这些当成额外的命令行参数而非--prunepaths的有效值。
内容的提问来源于stack exchange,提问作者halloleo
相关产品推荐
相关产品推荐

