【问题标题】:.sh file not working as expected from java.sh 文件无法从 java 中按预期工作
【发布时间】:2020-05-02 13:22:56
【问题描述】:

我创建了一个 .sh 文件来将文件从一台服务器复制到另一台服务器(scp 命令),该文件在从 shell 运行文件时工作正常(将文件复制到目标)。

但我尝试使用命令从 Java 运行相同的文件

Runtime.getRuntime().exec(myShellScript)

执行命令但不复制文件。我从sh 文件中得到了回显,这意味着执行了 sh 文件,但没有复制任何文件。有什么想法吗?

【问题讨论】:

  • 你能用 .sh 文件和它的内容显示确切的代码吗?
  • 由于 all shell 脚本不会发生这种情况,我们需要一个 minimal reproducible example -- 一个特定的 shell 脚本示例实际上是 发生。
  • 由于您的脚本可以echo 内容到标准输出,顺便说一句,一些好的开始位置是运行pwd(检查它是否在您期望的目录中运行),set -x(到将它所做的一切记录到 stderr)和echo "$PATH"(确保正确设置了强制环境变量)。
  • 脚本可能试图告诉您出了什么问题。确保您可以看到错误消息(在 stderr 上),而不仅仅是回声。要获取示例错误消息以查找以验证 stderr 是否可见,您可以使用 echo "My Error" >&2ls /filenotfound
  • 可能与#!/字符串有关?

标签: java linux bash shell sh


【解决方案1】:

您尝试过使用Process Builder 吗?

ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("path/to/hello.sh");

还要确保脚本是可执行的(chmod u+x 文件名)

编辑:如果脚本将文件复制到运行 Java 进程的用户无权访问的目录,则除非使用 su 或 sudo,否则它将无法工作

【讨论】:

    【解决方案2】:

    如我所见,您必须使用 sh 执行脚本,而不仅仅是运行它。

    Runtime.getRuntime().exec("sh "+myShellScript)
    

    也请查看here

    【讨论】:

    • 只有在脚本不可执行(+x 权限和有效的 shebang)并导致错误时才需要这样做——当您强制解释器为 sh 时,这意味着像 #!/usr/bin/env bash#!/bin/zsh 这样的 shebang 会被忽略,因此一个正常工作的脚本可以尝试使用与它不兼容的 shell 运行并因此失败。
    • 此外,exec("sh " + myShellScript) 将您的 shell 脚本的 文件名 解析为传递给 shell 本身的代码的一部分。如果该名称包含空格,或者更糟糕的是,像 $(rm -rf ~) 这样的名称,所有相关人员都会遇到非常糟糕的一天。
    • 更进一步,OP 说脚本中的echos 正在运行,因此任何仅适用于使脚本根本无法运行的问题的答案显然是不合时宜的。
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多