Tomcat 启动脚本输出不适用于管道 (grep)

Tomcat 启动脚本输出不适用于管道 (grep)

我对 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 catalinasethave_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 进程)运行

相关内容