我想运行一堆脚本并输出grep。例如,运行它可以工作并具有所需的输出行:
$ myScript.sh
运行它不会:
$ myScript.sh | grep something
经过进一步审核后,myScript.sh中包含了这个内容:
#!/bin/sh
...
$JAVA_HOME/bin/java the.real.script.is.here ${1+"$@"}
我假设“| grep something”被吸入$ @列表。关于如何轻松管道输出的任何想法?谢谢!
编辑:感谢大家提供有关如何解析变量的信息。它必须是其他问题。也许这就是我要抓的东西。在我的输出中,我正在寻找带有“/SE_2012.old”的行。我用“| grep old”再次运行脚本,得到没有输出。我用“| grep SE”运行它,得到了一个结果。我用“旧”再次运行它,看看我是否疯了, DID 给我一个结果。
答案 0 :(得分:3)
首先,您的假设是不正确的。 shell会很好地解析其命令行,以告诉管道和参数之间的区别。这就是为什么你需要引号来逃避重定向,管道,子shell和其他低级表达式。
现在,针对手头的问题:假设您在运行时没有看到任何输出
$ myScript.sh | grep something
你可能正在看effect of buffering *。不幸的是,我无法确切地告诉你它在java应用程序中是如何发生的,所以我不能给你一个直接的解决方案,但是如果你检查一下你可以告诉的java代码的内部结构。
*与输出只是去标准输出以外的地方相反。
答案 1 :(得分:1)
“| grep something”不可能被吸入$ @列表,所以应该有另一个问题。也许脚本使用行缓冲来输出tty,否则会使用完全缓冲? (在结束之前,你是否等待脚本完成无效?)“grep something”中的“something”可能会被解释(意外地)为与输入行不匹配的正则表达式吗?
cat
代替grep something
:它有效吗?