![Tomcat 启动脚本输出不适用于管道 (grep)](https://linux22.com/image/155402/Tomcat%20%E5%90%AF%E5%8A%A8%E8%84%9A%E6%9C%AC%E8%BE%93%E5%87%BA%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8E%E7%AE%A1%E9%81%93%20(grep).png)
我对 Tomcat 9.0.21 启动脚本 catalina.sh 的这种行为感到完全困惑:
# following line added by me
echo "CATALINA_HOME"
# following line added by me
echo $have_tty
if [ $have_tty -eq 1 ]; then
# following line added by me
echo "CATALINA_HOME"
echo "Using CATALINA_BASE: $CATALINA_BASE"
echo "Using CATALINA_HOME: $CATALINA_HOME"
echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
if [ "$1" = "debug" ] ; then
echo "Using JAVA_HOME: $JAVA_HOME"
else
echo "Using JRE_HOME: $JRE_HOME"
fi
echo "Using CLASSPATH: $CLASSPATH"
if [ ! -z "$CATALINA_PID" ]; then
echo "Using CATALINA_PID: $CATALINA_PID"
fi
fi
现在,当我运行时,catalina version | grep CATALINA_HOME
我看不到原始脚本版本的任何结果。在我修改后的脚本版本中我只能看到“if have_tty”部分之前回显的内容!
catalina | grep CATALINA
CATALINA_HOME
我希望还能看到 if 块内的下一个 CATALINA_HOME 回显以及“Using CATALINA_HOME ...”行。
那里发生了什么事?
(如果重要的话,我正在运行 Mac OS X 10.14.5,并使用 iTerm 和 zsh 作为 shell)
更新
人们评论说这是因为have_tty
变量没有设置,但这对我来说不是问题。当我刚刚运行时,catalina version
我得到完整的输出:
CATALINA_HOME
1
CATALINA_HOME
Using CATALINA_BASE: /usr/local/Cellar/tomcat/9.0.21/libexec
Using CATALINA_HOME: /usr/local/Cellar/tomcat/9.0.21/libexec
Using CATALINA_TMPDIR: /usr/local/Cellar/tomcat/9.0.21/libexec/temp
Using JRE_HOME: /Users/jumar/.jenv/versions/1.8.0.171
Using CLASSPATH: /usr/local/Cellar/tomcat/9.0.21/libexec/bin/bootstrap.jar:/usr/local/Cellar/tomcat/9.0.21/libexec/bin/tomcat-juli.jar
Server version: Apache Tomcat/9.0.21
...
只是使用管道(grep),事情开始看起来很奇怪:
catalina version | grep CATALINA_HOME
CATALINA_HOME
# here should be the missing "Using CATALINA_HOME..."
答案1
首先感谢@Zeitounator 和@AB 的评论!
经过对不同 tomcat 版本的一些测试并深入挖掘后,我发现问题确实在于have_tty
设置为零。在管道中使用catalina脚本会使if [ -t 1 ];
测试失败。
我很困惑,因为正确使用 plain catalina
sethave_tty
为 1。更奇怪的是,它曾经与以前的小 tomcat 版本一起使用。事实上,它是在这次提交中引入的:https://github.com/apache/tomcat/commit/bf894a0e6b5c8f92b122452645e93d63277ad3ab
看来该-t 1
测试在管道中使用时不合适。相反,它应该是-t 0
(这是根据 AB 的评论“通常测试是在标准输入上完成的”)。
答案2
从测试命令中删除| grep CATALINA
,如果您没有从该行获得任何输出:
echo $have_tty
那么 $have_tty 未设置,将导致执行不进入 if 块。您必须跟踪 $have_tty 最初设置的位置。
看起来卡特琳娜使用这个命令确定它是否有 tty:
$ tty
/dev/ttys011
要获取 tty,请确保脚本从命令行运行,而不是通过非 tty 进程(例如 init 进程)运行