首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shell-script不提供Ubuntu中的预期输出。

Shell-script不提供Ubuntu中的预期输出。
EN

Stack Overflow用户
提问于 2018-04-08 06:09:08
回答 1查看 80关注 0票数 4

Shell脚本:

代码语言:javascript
复制
#!/bin/sh
# -*-sh-*-
java -classpath Test.jar Test test1.xml > javaOutput 2>&1;
if cat javaOutput | tr '\n' ' ' | grep ".*java.lang.IndexOutOfBoundsException0.*ArrayList.java:653.*Test.java:142.*" &>/dev/null; then
    echo TRUE;
else
    echo FALSE;
fi

输出文件内容(javaOutput):

代码语言:javascript
复制
0,2,468.000000
1,2,305.000000
2,5,2702.000000
3,3,1672.000000
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at Test.processPayments(Test.java:113)
    at Test.processFile(Test.java:131)
    at Test.main(Test.java:142)

我使用的是以下版本的ubuntu:

代码语言:javascript
复制
Distributor ID: Ubuntu
Description:    Ubuntu 17.04
Release:    17.04

当我在命令提示符中复制和粘贴脚本时,它正常工作,并如预期的那样回显FALSE,但是每当我执行脚本时,它都会回显TRUE。我甚至在MacOs中运行了这个脚本,它在MacOs中按预期执行。我很困惑。任何帮助或洞察力都将不胜感激。

注意:这里的期望是得到假,因为输出内容中没有字符串IndexOutOfBoundsException0

EN

回答 1

Stack Overflow用户

发布于 2018-04-08 06:55:43

我明白了;在bash (一个在POSIX标准指定的基本集合上添加了许多特性的shell程序)和破折号(一个最小的POSIX shell)之间有一个小的语法差异。许多OSes使用bash /bin/sh,但是Debian (和Ubuntu)在前一段时间切换到了破折号。

语法区别在于,将标准输出和标准错误都重定向到同一位置的简写&>是bash扩展;dash将将其解析为两个独立的标记:& (命令分隔符,用于在后台运行命令)和> (标准输出的重定向)。由于&标志着一个命令的结束和另一个命令的开始,所以重定向不适用于前面的命令,因此它本身是一个最小的命令。从本质上讲,dash是将ifthen之间的东西解析为:

代码语言:javascript
复制
cat javaOutput | tr '\n' ' ' | grep ".*java.lang.IndexOutOfBoundsException0.*ArrayList.java:653.*Test.java:142.*" &
>/dev/null

...and if只查看该块中最后一个命令的成功/失败,这只是一个重定向.总是成功的。

幸运的是,解决方案很简单:不要使用bash速记,使用完整的2>&1重定向stdout和stderr:

代码语言:javascript
复制
if cat javaOutput | tr '\n' ' ' | grep ".*java.lang.IndexOutOfBoundsException0.*ArrayList.java:653.*Test.java:142.*" >/dev/null 2>&1; then
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49714983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档