使用终端或 bash 脚本创建和写入 .plist
Posted
技术标签:
【中文标题】使用终端或 bash 脚本创建和写入 .plist【英文标题】:Creating and writing into .plist with Terminal or bash script 【发布时间】:2014-12-09 12:57:12 【问题描述】:我需要在安装后创建一个 .plist 文件,我可以使用的唯一选项是 bash 脚本。我必须使用 bash 脚本在/Library/launchAgents
中创建一个 foo.plist,并且我使用了以下命令:
cd /Library/launchAgents
touch foo.plist
现在我需要将内容写入这个 .plist 文件,例如:
".plist contents" >> foo.plist
是否有命令可以在终端中执行此操作?
【问题讨论】:
要写入plist的plist内容在哪里?我的意思是你在文件中有他们的列表吗?与他们相应的价值?它们在 shell 变量中吗?为什么一定要用bash
,为什么不能用编辑器?
是的,我有一个工作的 .plist 文件。我需要使用 bash,因为安装程序会运行这个 bash 脚本。以便在安装过程中将该过程作为安装后步骤自动化。
【参考方案1】:
PlistBuddy 就是你想要的。
/usr/libexec/PlistBuddy Info.plist
File Doesn't Exist, Will Create: Info.plist
然后像这样在文件中添加一个条目,
/usr/libexec/PlistBuddy -c 'add CFBundleIdenfier string com.tencent.myapp' Info.plist
顺便说一句,man plist
、man plutil
可能对你有帮助。
Command Format:
Help - Prints this information
Exit - Exits the program, changes are not saved to the file
Save - Saves the current changes to the file
Revert - Reloads the last saved version of the file
Clear [<Type>] - Clears out all existing entries, and creates root of Type
Print [<Entry>] - Prints value of Entry. Otherwise, prints file
Set <Entry> <Value> - Sets the value at Entry to Value
Add <Entry> <Type> [<Value>] - Adds Entry to the plist, with value Value
Copy <EntrySrc> <EntryDst> - Copies the EntrySrc property to EntryDst
Delete <Entry> - Deletes Entry from the plist
Merge <file.plist> [<Entry>] - Adds the contents of file.plist to Entry
Import <Entry> <file> - Creates or sets Entry the contents of file
Entry Format:
Entries consist of property key names delimited by colons. Array items
are specified by a zero-based integer index. Examples:
:CFBundleShortVersionString
:CFBundleDocumentTypes:2:CFBundleTypeExtensions
Types:
string
array
dict
bool
real
integer
date
data
Examples:
Set :CFBundleIdentifier com.apple.plistbuddy
Sets the CFBundleIdentifier property to com.apple.plistbuddy
Add :CFBundleGetInfoString string "App version 1.0.1"
Adds the CFBundleGetInfoString property to the plist
Add :CFBundleDocumentTypes: dict
Adds a new item of type dict to the CFBundleDocumentTypes array
Add :CFBundleDocumentTypes:0 dict
Adds the new item to the beginning of the array
Delete :CFBundleDocumentTypes:0 dict
Deletes the FIRST item in the array
Delete :CFBundleDocumentTypes
Deletes the ENTIRE CFBundleDocumentTypes array
【讨论】:
我发现这篇文章除了这个答案之外非常有用:medium.com/@marksiu/what-is-plistbuddy-76cb4f0c262d【参考方案2】:你的问题并没有很好地说明你得到了什么,或者为什么你需要在bash
中这样做,但如果你必须这样做,你可以这样做:
#!/bin/bash
VERSION=2.12
cat > foo.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildAliasOf</key>
<string>ProEditor</string>
<key>BuildVersion</key>
<value>$VERSION</value>
</dict>
</plist>
EOF
因此,您将其保存在名为 Buildplist
的文件中,然后执行此操作以使其可执行
chmod +x Buildplist
然后你输入这个来运行它:
./Buildplist
您可以通过将第二行更改为以下内容,将 plist 文件直接写入/Library/launchAgents
:
cat > /Library/launchAgents/yourApp/yourApp.plist <<EOF
你也可以让它接受参数。所以如果你想传递Author作为第一个参数,你可以这样做:
#!/bin/bash
VERSION=2.12
AUTHOR="$1"
cat > foo.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildAliasOf</key>
<string>ProEditor</string>
<key>BuildVersion</key>
<value>$VERSION</value>
<author>$AUTHOR</author>
</dict>
</plist>
EOF
然后运行
./Buildplist "Freddy Frog"
将“弗莱迪青蛙”作为作者。
如果你想避免覆盖任何已经存在的 plist 文件,你可以这样做:
#!/bin/bash
PLISTFILE="/Library/launchAgents/yourApp/yourApp.plist"
# If plist already exists, do not overwrite, just exit quietly
[ -f "$PLISTFILE" ] && exit
cat > "$PLISTFILE" <<EOF
...
...
EOF
为了简化维护,我把plist文件的名字放在了一个变量中,避免输入两次。
【讨论】:
“为什么我必须这样做?”因为我想在我的应用程序安装期间执行一个脚本。当安装程序“这是一个 DMG”和“PKG”安装程序完成安装时,我需要在最后执行此 bash 脚本以将此 .plist 文件放入 /Library.. 有什么方法可以检查并跳过文件是否已经存在?? 是的,当然。我在最后添加了一些额外的内容来展示如何做到这一点。请再看看。/usr/libexec/PlistBuddy
更好。以上是关于使用终端或 bash 脚本创建和写入 .plist的主要内容,如果未能解决你的问题,请参考以下文章