当我从 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/