如何使用命令替换来使用 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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PlistBuddy 将数组添加到 Plist?

如何在 PlistBuddy 中输入数据

如何使用 PlistBuddy 将多个条目添加到 plist 字典

使用 PlistBuddy 处理 hdiutil 输出

如何使用?

如何使输入文本字段用*替换任何字符? [复制]