我正在尝试运行一个简单的 launchd 脚本,当文件更改时,该脚本会将文件从一个目录复制到另一个目录,但我想使用唯一的时间戳粘贴它,以便对文件进行版本控制。我的 launchd 脚本如下所示:
<?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>Label</key>
<string>change.file.copy</string>
<key>ProgramArguments</key>
<array>
<string>cp</string>
<string>/path/to/folder/sample_file.txt</string>
<string>/path/to/another_folder/$(gdate +%Y%m%d_%T.%N)_sample_file.txt</string>
</array>
<key>WatchPaths</key>
<array>
<string>/path/to/folder/sample_file.txt</string>
</array>
</dict>
</plist>
如果我通过终端运行该命令,它就可以正常工作,即如果我运行:
cp /path/to/folder/sample_file.txt /path/to/another_folder/$(gdate +%Y%m%d_%T.%N)_sample_file.txt
但是,每当事件触发时,它都会创建一个包含(gdate + %Y%m%d_%T.%N)字符串而不是实际日期的文件,即日期运算符在通过 launchd 运行时无法解析。
我总是可以创建一个可执行文件并通过 launchd 运行它,但我想知道为什么上述操作不能正常工作。
谢谢您的帮助!
答案1
解决方案如下。在 Google 上使用正确的关键字进行搜索至关重要。
<key>ProgramArguments</key>
<array>
<string>bash</string>
<string>-c</string>
<string>cp /path/to/folder/sample.txt /path_to_another_folder/$(/usr/local/bin/gdate +%Y%m%d_%T.%N)_sample.txt</string>
</array>