bash脚本中的三通和管道

时间:2012-07-18 13:41:25

标签: bash stdout stderr tee

我需要将bout中的stout和stderr重定向到单独的文件。   好吧,我完成了这个命令:

  ((/usr/bin/java -jar /opt/SEOC2/seoc2.jar 2>&1 1>&3 | tee --append /opt/SEOC2/log/err.log) 3>&1 1>&2 | tee --append /opt/SEOC2/log/app.log) >> /opt/SEOC2/log/combined.log 2>&1  &

命令行运行良好。

尝试将相同的命令放入 bash脚本

 ...
 12 cmd="(($run -jar $cmd 2>&1 1>&3 | tee --append $err) 3>&1 1>&2 | tee --append $log) >> $combined 2>&1"
 ...
 30                 echo -e "Starting servis..." 
 31                 $cmd &
 32                 pid=`ps -eo pid,args | grep seoc2.jar | grep -v grep | cut -c1-6`
 33                 if [ ! -z $pid ]; then
 ...

导致如下错误:

   root@operator:/opt/SEOC2# seoc2 start
   Starting servis...
   /usr/local/bin/seoc2: line 31: ((/usr/bin/java: dir or file doesn't exist

试图用$(),``等覆盖这个命令,但完全没有效果:(

任何建议或建议都会非常感激,已经玩了好几个小时了:/

thanx很多 雷

1 个答案:

答案 0 :(得分:2)

如果将整个命令行存储在变量中,则必须使用eval来执行它:

cmd="(($run -jar $cmd 2>&1 1>&3 | tee --append $err) 3>&1 1>&2 | tee --append $log) >> $combined 2>&1"
...
eval $cmd &