【问题标题】:How can you pipe the output of a script that has ${1+"$@"} variables used within it?如何通过管道输出包含 ${1+"$@"} 变量的脚本的输出?
【发布时间】:2012-12-19 02:49:10
【问题描述】:

我想运行一堆脚本并 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”再次运行脚本并得到no输出。我用“| grep SE”运行它,得到了结果。我用“old”再次运行它,看看我是否发疯了,它确实给了我一个结果。

【问题讨论】:

  • 我认为您在这里没有提供足够的信息来说明发生了什么。脚本中的参数处理当然不可能消耗管道。
  • 不幸的是,我唯一遗漏的是检查是否设置了 JAVA_HOME 以及类路径位置。不过我会进一步调查。

标签: bash variables parameters grep pipe


【解决方案1】:

首先,你的假设是不正确的。 shell 很好地解析了它的命令行,以区分管道和参数。这就是为什么您需要引号来转义重定向、管道、子shell 和其他低级表达式。

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

$ myScript.sh | grep something

您可能会看到effect of buffering*。不幸的是,我无法准确地告诉你它在 java 应用程序中是如何发生的,所以我不能给你一个直接的解决方案,但是如果你检查 java 代码的内部,你可能会知道。

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

【讨论】:

    【解决方案2】:

    “| grep something”不可能被吸进$@列表,所以应该还有问题。也许脚本对 tty 输出使用行缓冲,否则使用全缓冲? (您是否等待脚本完成才能得出结论它不起作用?)也许“grep something”中的“something”被解释为(意外)与输入行不匹配的正则表达式?

    • 试试cat 而不是grep something:行得通吗?
    • 向我们展示“某物”的真正价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多