我正在寻找一种编程方式,仅当条目不存在时才将其附加到 crontab。此外,退出代码必须适用0
于条目不存在或条目存在两种情况。
我试过:
(crontab -l -u root 2>/dev/null | grep -F -v "@reboot /usr/bin/mycommand" || true; echo "@reboot /usr/bin/mycommand 2>&1") | sudo crontab -u root -
(crontab -l -u root 2>/dev/null | grep -F -v "@reboot /usr/bin/mycommand_2" || true; echo "@reboot /usr/bin/mycommand_2 2>&1") | sudo crontab -u root -
但是第二个仍然覆盖了 crontab 中的所有内容。
答案1
未经测试,因此请谨慎
entries=(
"@reboot /usr/bin/mycommand"
"@reboot /usr/bin/mycommand_2"
)
to_add=()
f=$(mktemp)
crontab -u root -l > "$f"
for entry in "${entries[@]}"; do
grep -qF "$entry" "$f" || to_add+=( "$entry" )
done
{ cat "$f"; printf "%s\n" "${to_add[@]}"; } | crontab -u root "$f"
rm "$f"
您的解决方案仅打印新条目。使用tee
进程替换将包括原始 crontab 以及可能的新条目:
crontab -l -u root 2>/dev/null | tee >(sh -c '
grep -qF "@reboot /usr/bin/mycommand" || echo "@reboot /usr/bin/mycommand 2>&1"
') | sudo crontab -u root -