如何使用命令替换来使用 PlistBuddy
Posted
技术标签:
【中文标题】如何使用命令替换来使用 PlistBuddy【英文标题】:How to use PlistBuddy using command substiution 【发布时间】:2017-06-14 08:13:03 【问题描述】:我正在尝试以下脚本
#!/bin/bash
OUTPUT="$(cat /Users/admin/Desktop/plist-script-output/keys-updated.txt | sed 's/"//g; s/^/-c "Print :/g; s/$/"/g' | tr '\n' ' ')"
FILE="/Users/admin/Desktop/plist-script-output/plist-data/data.plist"
PLISTBUDDY=$(/usr/libexec/PlistBuddy $OUTPUT $FILE 2>&1)
echo "$PLISTBUDDY"
上述脚本的输出是Unrecognized Command
OUTPUT变量的值为
-c "打印:Ant-Conversion" -c "打印:Newitem" -c "打印:Area" -c "打印:Contact"
2>&1 这是为了打印错误(不存在键)和正确的输出。
keys-updated.txt 包含要从 plist 文件中提取的密钥列表(不必全部都存在于 plist 中)
解决方案(不工作)
尝试了@Nahuel 的解决方案。但是这条线
PLISTBUDDY=$(eval set -- $OUTPUT;/usr/libexec/PlistBuddy "$@" "$FILE")
仅提供 plist 中不存在的键的列表
这是我使用@Nahuel 的解决方案后收到的输出
打印:条目,“状态”,不存在
打印:条目,“通知”,不存在
打印:条目“IsMvnMgrSupported”不存在
打印:条目“BuildsetFile”不存在
打印:条目“RollupClocReportToModule”不存在
打印:条目,“分支”,不存在
打印:条目,“Ant-Conversion”,不存在
打印:条目,“IndexTag”,不存在
打印:条目,“WO”,不存在
打印:条目,“标签”,不存在
打印:条目,“Newitem”,不存在
关于直接在命令行上使用命令
admin:桌面管理员$。 /usr/libexec/PlistBuddy -c “打印:区域” -c “打印:联系方式” -c “打印:电子邮件” -c “打印:语言” -c “打印:位置” -c “打印:名称“ -c “打印:注释” -c “打印:目的” -c “打印:跟踪” -c “打印:类型” -c “打印:URL” -c “打印:状态” -c “打印:通知” -c “打印:IsMvnMgrSupported” -c “打印:BuildsetFile” -c “打印:RollupClocReportToModule” -c “打印:Branches” -c “打印:Ant-Conversion” -c “打印:IndexTag” -c “打印:WO " -c "打印:标签" -c "打印:Newitem" /Users/admin/Desktop/plist-script-output/plist-data/ActiveMQ.plist
输出结果是
监控。 呱呱坠地 cddcdcdc 。 爪哇。 dvfvfvfvfvfvfv。 活动MQ。 cddcdcdcdc 。 来自 Apache Software Foundation 的消息传递 (JMS) 框架。 基础设施 。 框架 。 jdbcjdbcdjdcnnjn 。 打印:条目,“:状态”,不存在。 打印:条目,“:通知”,不存在。 打印:条目,“:IsMvnMgrSupported”,不存在。 打印:条目,“:BuildsetFile”,不存在。 打印:条目,“:RollupClocReportToModule”,不存在。 打印:条目,“:分支”,不存在。 打印:条目,“:Ant-Conversion”,不存在。 打印:条目,“:IndexTag”,不存在。 打印:条目,“:WO”,不存在。 打印:条目,“:标签”,不存在。 打印:条目,“:Newitem”,不存在。 中止陷阱:6
【问题讨论】:
【参考方案1】:看了 sed 和 tr 命令。似乎 /Users/admin/Desktop/plist-script-output/keys-updated.txt 包含
Ant-Conversion
Newitem
Area
Contact
整个都可以用 bash 内置函数来完成:
# local args arr pcmd (if inside a function)
# readarray -t arr </Users/admin/Desktop/plist-script-output/keys-updated.txt
# because readarray doesn't work on Mac
IFS=$'\n' read -d '' arr </Users/admin/Desktop/plist-script-output/keys-updated.txt
args=()
for pcmd in "$arr[@]"; do
args+=(-c "Print :$pcmd")
done
PLISTBUDDY=$(/usr/libexec/PlistBuddy "$args[@]" "$FILE" 2>&1)
第一个答案:
OUTPUT='-c "Print :Ant-Conversion" -c "Print :Newitem" -c "Print :Area" -c "Print :Contact"'
引号不是语法,因为引号处理是在变量扩展之前完成的。
不安全(注入),在这种情况下使用 eval
PLISTBUDDY=$(eval /usr/libexec/PlistBuddy $OUTPUT $FILE 2>&1)
暂时想不出更好的办法
稍微好一点
PLISTBUDDY=$(eval set -- $OUTPUT;/usr/libexec/PlistBuddy "$@" "$FILE" 2>&1)
【讨论】:
感谢 Nahuel Fouilleul 提供解决方案。但是 PLISTBUDDY=$(eval set -- $OUTPUT;/usr/libexec/PlistBuddy "$@" "$FILE" 2>&1) 仅打印 plist 文件中不存在的那些键.我希望输出包含所有键的结果,而不仅仅是 plist 中不存在的那些键 根据上述解决方案,我没有收到 plist 中存在的那些键的输出。输出仅包含“不存在”键的列表。你能帮忙@Nahuel Fouilleul 这次我的 OUTPUT 变量包含以下内容 readarray 不能在 MacOSX 上运行....谢谢你的解决方案.. 你能提供任何其他可以在 Mac 上运行的 sn-p 答案解决了 bash 的问题,其他问题来自 PlistBuddy以上是关于如何使用命令替换来使用 PlistBuddy的主要内容,如果未能解决你的问题,请参考以下文章