【问题标题】:How to make bash wrapper script to execute java jar that takes stdin and outputs to stdout如何制作 bash 包装脚本来执行将标准输入和输出到标准输出的 java jar
【发布时间】:2020-12-31 10:41:24
【问题描述】:

我制作了一个 java 程序,它从标准输入接收输入并将输出返回到标准输出,它运行得非常好,使用:

cat inputfile | java -jar whatever.jar <args>

我想制作一个 bash 包装脚本放入我的 ~/bin,这样我就可以运行了

cat inputfile | whatever

,它将执行完全相同的功能。

如何制作一个包装脚本,将标准输入不受干扰地传递到 jar,同时接收标准输出回显到 CLI?

我想我可以通过一种方式将输入文件发送到命令,但不知道如何同时从命令中获取输出。

【问题讨论】:

  • 顺便说一句,cat inputfile | whatever 是通常所说的“无用的猫”;有时使用输入重定向更简单,例如whatever &lt;inputfile
  • 当您尝试将java -jar whatever.jar 放入您的脚本时遇到什么问题?我假设出了问题导致这个问题。当您自己尝试时出了什么问题,没有做任何特别的事情来尝试通过标准输入和标准输出(事实上,您不需要为此目的做任何特别的事情)。
  • 现在,该问题描述了您正在尝试做的事情,但没有描述您在尝试这样做时遇到的具体问题,也没有提供minimal reproducible example 让其他人自己看到该问题或测试它是否已成功解决。

标签: java bash io-redirection


【解决方案1】:

解决方案:

#!/bin/bash
exec java -jar whatever.jar "$@"

讨论:

与所有 Unix shell 一样,Bash 有一个名为 $@ 的特殊变量。它包含一个 shell 脚本的参数列表。我会用它来接收&lt;args&gt;whatever.jar

这样,Bash 甚至都不会触及 whatever.jarstdinstdout。它只是让java 调用whatever.jar,通过$@&lt;args&gt; 传递给它,然后让开。从stdin 读取和写入stdout 的所有操作都由whatever.jar 直接完成。

【讨论】:

  • 您应该双引号 $@(即使用 "$@")以避免混淆包含空格或其他“有趣”字符的参数。此外,这将是使用exec 命令(即exec java -jar whatever.jar "$@")的好地方,它可以防止shell 脚本等待java 程序完成——使用exec,shell 脚本有效地立即退出,然后交给java 程序。
  • 谢谢你的建议,戈登!你是对的。我相应地编辑了帖子。
【解决方案2】:

这应该可以完成工作:

#!/bin/bash
java -jar whatever.jar <args>

【讨论】:

    【解决方案3】:

    我认为你的 bash 脚本应该只包含 java 调用。

    然后将文件作为输入重定向到脚本:

    ./script < inputfile
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2010-12-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多