bash中的条件执行和重定向

时间:2012-07-04 02:57:09

标签: bash io-redirection

我想要这样的事情:

maybeexec command arg1 arg2 &> /logs/log

其中maybeexec是一个bash函数,如下所示:

maybeexec() {
  if ! ps ax | grep -v grep | grep "$*" > /dev/null
  then
    "$@"
  fi
}

所以基本上它会检查command arg1 arg2是否已经在运行,如果是,则不会运行它。

我的问题是,即使command arg1 arg2已经在运行,因此maybeexec没有同时运行它,/logs/log仍会打开重定向,并会覆盖现有的{{} 1}},我不想要。

解决这个问题最优雅的方法是什么?如果可能的话,我想像现在一样继续调用/logs/log,因为我使用它来运行许多将输出重定向到不同文件的命令。

谢谢!

2 个答案:

答案 0 :(得分:1)

我不明白您的功能尝试做什么或重定向问题是什么。启动进程后,无法在外部修改文件描述符表(GDB和其他黑客除外)。

请在脚本中使用proper process management代替ps。这种方法并不好。要按名称搜索进程,您应该使用pgrep,但这绝不应该在脚本中完成。

另见:http://wiki.bash-hackers.org/howto/mutex 并且:http://mywiki.wooledge.org/BashFAQ/045

答案 1 :(得分:1)

您需要稍微重写一下代码。在函数内部进行重定向,而不是在外部。重定向的目标是noe指定为函数的第一个参数(稍后将使用shift删除):

maybeexec /logs/log command arg1 arg2

maybeexec() {
  LOG=$1
  shift
  if ! ps ax | grep -v grep | grep "$*" > /dev/null
  then
    "$@" >& $LOG
  fi
}