用两个命令猛击诺胡普



我的bashrc中有一个小函数,所以我可以运行一个脚本,并在完成后将输出发送到我的电子邮件。代码如下:

run() {
    email=example@gmail.com
    last="${!#}"
    rest="${@:1:($#-1)}"
    (nohup $rest &> $last < /dev/null; mail -s "$rest" "$email" < "$last") &
}

函数是这样用

run ./script.sh arg1 arg2 output

它似乎大部分时间都在工作,但有时即使脚本完成,电子邮件也不会发送。我怀疑这与我关闭服务器终端有关。在这些情况下,由于nohup,脚本仍在运行,但它不会在最后发送电子邮件。我真的很感激一些指示,以便让它正常工作。

有多种方法可以解决此问题,但我想我会推荐这样做:

run() {
  email=example@gmail.com
  rest="${@:1:($#-1)}"
  nohup bash -c "$rest < /dev/null 2>&1 | mail -s "$rest" "$email"" &
}

问题是您的nohup命令在/dev/null后以分号结尾,因此不适用于mail部分。该( ... )引入了一个子shell,但不是外部命令,因此nohup ( ... )不起作用,这就是为什么需要bash -c "..."的原因(如果这很重要,您也可以使用${SHELL} -c " ..."来增加可移植性)。当括在另一组引号中时,您需要转义双引号。此外,临时文件不是必需的(除非您出于某种原因想保留它 - 如果是这种情况,请随时将重定向放回并用;而不是|分隔命令)。在不需要输出文件的情况下,您也可以省去 rest=... 位并仅将其调用为 run script.sh arg1 arg2 ,但是如果您已经将对该位的调用分布在其他代码中,那么保留该位可能会更简单 - 您必须弄清楚那部分......

相关内容

  • 没有找到相关文章

最新更新