bash脚本中的tee和管道

bash脚本中的tee和管道,bash,stdout,stderr,tee,Bash,Stdout,Stderr,Tee,我需要将bash中的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 & (/usr/bin/java-jar/opt/SEO

我需要将bash中的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 & (/usr/bin/java-jar/opt/SEOC2/SEOC2.jar 2>&11>&3|tee--append/opt/SEOC2/log/err.log)3>&11>&2|tee--append/opt/SEOC2/log/app.log)>/opt/SEOC2/log/combined.log 2>&1& 从命令行运行时,它可以正常工作

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

... 12 cmd=“($run-jar$cmd 2>&11>&3|tee--append$err)3>&11>&2|tee--append$log)>>2>&1” ... 30 echo-e“启动服务…” 31美元cmd& 32 pid=`ps-eo pid,args | grep seoc2.jar | grep-v grep | cut-c1-6` 33如果[!-z$pid];然后 ... 导致如下错误:

root@operator:/opt/SEOC2# seoc2 start Starting servis... /usr/local/bin/seoc2: line 31: ((/usr/bin/java: dir or file doesn't exist root@operator:/opt/SEOC2#SEOC2开始 开始服务。。。 /usr/local/bin/seoc2:第31行:(/usr/bin/java:dir或文件不存在 试图用$(),``等覆盖此命令,但没有任何效果:(

如果您有任何建议或建议,我们将不胜感激,您可以在这里玩上几个小时:/

很多
Rene

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

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

您是否可以发布在bash提示符处键入的内容以调用失败的脚本,并显示从何处调用它(即,当您尝试运行脚本时,当前目录是什么)您需要将整个管道放在一个变量中吗?问题是,带引号的字符串会导致shell不将括号解释为shell语法,而将其解释为字符串中的文字字符。最简单的方法是在第31行写出命令。
eval$cmd
可以工作,但不推荐。@JoshGreife不是您想要的你在我的原始帖子的最后一个灰色框中询问?即skcript位于/opt/SEOC2,但应该能够从任何地方运行$err、$log、$combined是指向/opt/SEOC2/log的绝对路径位置。在本例中,我从/opt/SEOC2ok运行它,但不确定绝对位置。我认为它可能是相对路径。这个提示似乎有效嗯,虽然它生成的ps树是这样的:15583 pts/0 S 0:00/bin/bash/usr/local/bin/seoc2 start 15585 pts/0 S 0:00 u/bin/bash/usr/local/bin/seoc2 start 15586 pts/0 S 0:00 u/bin/bash/usr/local/bin/seoc2 start 15588 pts/0 Sl 1:41 |/usr/bin/java-jar/opt/seoc2/seoc2.jar,但它没有效果它的功能真的很好用!非常感谢。R@user1062331:这些额外进程不是由
eval
引起的,而是由括号引起的。每一级
()
将创建一个子shell。
cmd="(($run -jar $cmd 2>&1 1>&3 | tee --append $err) 3>&1 1>&2 | tee --append $log) >> $combined 2>&1"
...
eval $cmd &