我最近从 切换2>&1 >>
到 &>>
有没有办法拥有在使用 /bin/bash 作为 shell?默认情况下,它使用 /bin/sh 并且手册页没有给出如何使用其他内容的指示。即使在crontab
一个可以使用SHELL=/bin/bash
这给我带来的主要问题是:
echo "do-smth.sh &>> logfile" | at now + 8 hours
他们没有将 stdout 和 stderr 附加到我的日志文件中,而是完全迷失了方向,甚至没有收到电子邮件。
此解决方法不起作用,引用了意外重定向:
echo "bash <<< \"do-smth.sh &>> logfile\"" | at now + 8 hours
我使用 Linux,Ubuntu 11.10 风格,这应该不重要。
答案1
你的问题是你的命令的编写方式sh
是试图处理herestring重定向,并且(在Ubuntu中链接到dash
,而不是bash
)它没有<<<
运算符。你可能想要这个:
echo 'bash -c "do-smth.sh &>>logfile"' | at now + 8 hours
答案2
作为记录,这是我在一个用例中所经历的事情。注意如何严重地由于不可避免的单引号或双引号转义,它被混淆了:
pidof -x pngcrush || at now <<< 'time nice bash -c '\''
(for f in $(find orderlog/ -mtime -1 -name \*.png);
do convert -trim +repage -colors 64 -depth 6 -verbose $f $f.tmp;
ls -lFa $f*;
touch -r $f $f.tmp && mv -f $f.tmp $f;
done;
time find orderlog/ -mtime -3 -name \*.png -execdir pngcrush -bit_depth 8 -d ~/tmp -oldtimestamp {} + ;
mv -fv ~/tmp/*.png orderlog/;
timeout 1h time find orderlog/ -mtime -2 \( -name \*.png -o -name \*.gif \) -execdir optipng -keep -preserve -o6 -v {} + ;
rm -vf orderlog/*.png.{bak,tmp} ) &> orderlog/imgshrink.log'\'' '
仅在此处添加换行符以提高可读性。
由于它位于脚本内部,因此它已经发展到我应该将其转换为此处文档的位置在阅读,除非我害怕破坏(非)解析巴什。
答案3
#!/bin/bash
为什么不在cron 运行的脚本顶部执行此操作呢?如果您使用要使用的脚本创建一个目录,则可以将其置于源代码控制之下,这样在您失去对该硬盘驱动器的访问权限时可以更轻松地进行恢复。您还可以使用 puppet、chef 或 ansible 安装这些脚本,只需在 crontab 中添加单行条目即可运行这些脚本。