java - Process.= Runtime.getRuntime().exec() 不适合我

标签 java linux inputstream runtime.exec

当我从 java 执行 linux 命令时它不起作用任何人都可以帮助我解决这个问题。

process3 = Runtime.getRuntime().exec(new String[] {"ls",
                    "-1s", 
                     "--block-size=1",
                      TStamp+"/received/i*.*",
                      "$dir|",
                      "awk",
"'{print $2\"\\t\"$1}'",
                           ">>",
                  "./"+TStamp+"/qa/manifest_QAG.txt"});
InputStream in1 = process3.getInputStream();              
BufferedReader br1=new BufferedReader(new InputStreamReader(in1));
String line1 =null;
while((line1=br1.readLine())!=null)
{
System.out.println(line1);
} 

Edit1:我正在尝试列出文件并在 manifest_QAG.txt 中生成 list

Linux 下的实际命令:

ls -1s --block-size=1 20130328094916142/received/is*.* $dir| awk '{print $2"\t"$1}'

Edit2:我没有得到任何异常,甚至没有创建文件 manifest_QAG.txt

编辑 3:

最佳答案

您没有得到异常,因为 ls 命令不是 Java,它不是与异常通信,而是与 STDERR 上的错误消息和退出代码通信。

其实你必须明白当你输入一个命令时shell做了什么以及这个命令做了什么。因此,像这样的 shell 命令行

ls -1s --block-size=1 20130328094916142/received/is*.* $dir| awk '{print $2"\t"$1}'

由 shell 以这种方式处理:

  • shell:将 20130328094916142/received/is*.* 扩展为文件名列表
  • shell:将 $dir 部分展开为文件名列表
  • shell: 使用参数执行 ls 命令
    • ls
    • -1s
    • --block-size=1
    • 每个扩展文件名作为一个单独的参数
  • shell: 执行带有参数的awk命令
    • {print ...}
  • shell:将ls的输出连接到awk的输入
  • ls:计算参数
  • awk:读取每一行,用给定的脚本处理并输出结果。

你看:环境变量和通配符的扩展是shell完成的,不是ls

回到Java: execute NOT 像 shell 一样处理参数。那取决于你。因此,您的调用大致是这样的 shell 等价物:

ls '-1s' '--block-size=1' '20130328094916142/received/is*.*' '$dir' '|' 'awk' '{print $2"\t"$1}'

所有内容都被引用,甚至是管道,因此 shell 不会扩展任何内容。

问题到此为止。解决方案是什么?

  • 您可以模拟 shell 并用 Java 进行扩展。玩得开心。 (即这不是真正的解决方案)。
  • 您可以从 Java 而不是 ls 调用 shell。

后面是这样的:

shell 通常有一个 -c 选项,您可以在其中给它一个 命令字符串,然后以与实际键入的命令行相同的方式对其进行评估。

所以你这样调用命令

String[] args = {
    "/bin/sh",
    "-c",
    "ls -1s --block-size=1 20130328094916142/received/is*.* $dir| awk '{print $2\"\t\"$1}'"
};
Process process3 = Runtime.getRuntime().exec(args);

尽管正确引用 awk 命令可能需要做更多的工作。

关于java - Process.= Runtime.getRuntime().exec() 不适合我,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15685057/

相关文章:

java - 使用 PrimeFaces 从 Selectiomenu 获取值

java - 如果元素不为空,则使用 lambda 过滤器,否则忽略过滤器

java - 为什么java库的编码如此不可读?

python - 从 python 中的行/Robust XML解析器中删除垃圾字符

java - 为什么 close() 输入流很好?

java - 如何获取输入流的 crc 并返回其克隆是

java - 如何在 Spring Batch 中从 ItemReader 访问作业参数?

c - 在 C 中执行 exec 命令时如何并行读取 exec 命令的中间结果?

C++ MongoDB legacy client教程编译报错

c# - 为了使 Request.InputStream 保持事件状态,不处理 BinaryReader 对象?