【问题标题】:Invoking shell from java, it complaints "stty: standard input: Invalid argument"从java调用shell,它抱怨“stty:标准输入:无效参数”
【发布时间】:2016-10-31 18:03:47
【问题描述】:

我通过 java 的 Process 类调用一个 shell 命令并打印出来

"stty: standard input: Invalid argument" 

无论命令是对是错(shell命令的正常输出也会显示)。如果我在 shell 中运行 shell 命令,则不会显示此类错误消息。

命令是这样的:{"/bin/csh", "-c", "echo hello"}

【问题讨论】:

  • 在这种情况下,示例代码会很有帮助。
  • 我只做了非常简单的事情来从 java 调用“echo hello”。这段代码在几周前运行正常,所以我认为我的 bash 最近有问题,而不是 java
  • 我相信 Java 中有一些方法可以执行操作系统功能,并且不需要调用系统命令。你在调用什么命令 Java 没有相应的模块?
  • 好吧,我想创建一个嵌入在java中的shell。用户可以输入任何shell命令,java将执行它们并将stdout/stderr返回给java gui。

标签: java bash csh


【解决方案1】:

您正在从您的.profile.bash_profile 调用stty 命令。您必须将其标准错误重定向到/dev/null

stty blah blah blah 2>/dev/null

stty 无法处理 Java 在脱壳时提供的伪 tty。

【讨论】:

  • 谢谢,但是 blah 代表什么?
  • 它代表什么并不重要。在没有 tty 的上下文中调用 stty,例如 exec'd 进程,是错误的。你做不到。
【解决方案2】:

尝试使用 csh 的 -f 选项来禁用读取 .chsrc 和 .login 文件:

    {"/bin/csh", "-cf", "echo hello"}

【讨论】:

  • @solotim:为什么不呢?无论如何,如果它有效,则表明 .cshrc 或 .login 脚本正在尝试调整终端而不检查是否存在终端。下一步应该是将此检查添加到脚本中...
【解决方案3】:

引用java.lang.Process 的文档:

"创建进程的方法可能 不适用于特殊工艺 某些本机平台,例如 本机窗口进程,守护进程 进程,Win16/DOS 进程 Microsoft Windows 或 shell 脚本。 创建的子进程没有 它自己的终端或控制台。”

也许您更喜欢java.lang.ProcessBuilder

【讨论】:

  • 谢谢。但实际上我也使用了 ProcessBuilder,结果是一样的。
【解决方案4】:

你看过这里吗。 我设法运行了一些命令,例如this

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多