如何管道在其中使用$ {1 +“$ @”}变量的脚本的输出?

时间:2013-01-04 16:29:20

标签: bash variables parameters grep pipe

我想运行一堆脚本并输出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 给我一个结果。

2 个答案:

答案 0 :(得分:3)

首先,您的假设是不正确的。 shell会很好地解析其命令行,以告诉管道和参数之间的区别。这就是为什么你需要引号来逃避重定向,管道,子shell和其他低级表达式。

现在,针对手头的问题:假设您在运行时没有看到任何输出

$ myScript.sh | grep something
你可能正在看effect of buffering *。不幸的是,我无法确切地告诉你它在java应用程序中是如何发生的,所以我不能给你一个直接的解决方案,但是如果你检查一下你可以告诉的java代码的内部结构。

*与输出只是去标准输出以外的地方相反。

答案 1 :(得分:1)

“| grep something”不可能被吸入$ @列表,所以应该有另一个问题。也许脚本使用行缓冲来输出tty,否则会使用完全缓冲? (在结束之前,你是否等待脚本完成无效?)“grep something”中的“something”可能会被解释(意外地)为与输入行不匹配的正则表达式吗?

  • 尝试cat代替grep something:它有效吗?
  • 向我们展示“某事”的真正价值。