我正在尝试创建一个命令,无论通过还是失败,它都会向我发送一条短信。
到目前为止我的命令如下所示:
command && echo OK || echo Failed | echo ' 'at `date | sendmail [email protected]
因此,当文本传递时,我希望它向我发送一条文本(通过向我发送电子邮件),并且文本应如下所示:
3 月 2 日下午 2:37 确定
当测试失败时,它会向我发送以下短信:
3 月 2 日下午 2:37 失败。
我不确定如何echo
正确连接输出,我希望有人知道我的问题出在哪里。外壳是tcsh
。
编辑:
对于像 'ls' 这样的命令,我希望在终端中列出目录,但我希望“Ok”或“fail”转到“sendmail”部分。因此,所有命令都应照常打印到终端,但将“failed”或“ok”部分发送到 sendmail 部分。
答案1
OP的评论:
对于类似这样的情况,
ls
我想要终端中列出的目录,但是我想要“确定”或“失败”转到该sendmail
部分。
我无法在 中执行此操作tcsh
。这应该可以在 中工作bash
:
your_command ; { [ $? -eq 0 ] && echo -n OK || echo -n Failed ; echo " at `date`" ; } | …
我希望有人能从这里获取它,将上面的内容移植到tcsh
并写出更好的答案。
我能想到的最好的办法是写一个bash
脚本,前提是你的bash
机器上有这个脚本。关键是你可以从 运行这样的脚本tcsh
。这是一个快速而粗糙的脚本:
#!/bin/bash
"$@"
{ [ $? -eq 0 ] && echo -n OK || echo -n Failed ; echo " at `date`" ; } | sendmail [email protected]
如果需要,可以修改shebang。将这段代码保存到文件(例如sendstatus.sh
),使用使其可执行chmod
,然后像这样使用它:
./sendstatus.sh your_command
./sendstatus.sh your_command --with option -s
./sendstatus.sh ls
./sendstatus.sh ls -sl
修复:
echo -n
导致下一个echo
继续在同一行;- 最后一个
echo
没有从管道读取,因为它没有意义; date
在 ` 标记内(命令替换);- 命令按分隔符分组,
{}
因此它们的输出一起传递到最终|
。