我有一个Java应用程序,在主应用程序执行时运行各种Unix命令。
public static void shellExec(){
try{
System.out.println("Entering into the test shell loop");
List<String> commands = new ArrayList<String>();
commands.add("filePath"); //(filepath is the location of a file which contains various Unix command)
System.out.println(commands);
ProcessBuilder pb = new ProcessBuilder(commands);
pb.redirectErrorStream(true);
Process process = pb.start();
System.out.println("Started the Process Builder");
StringBuilder out = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null, previous = null;
while ((line = br.readLine()) != null)
if (!line.equals(previous)) {
previous = line;
out.append(line).append('\n');
System.out.println(line);
}
}catch(Exception ex){
ex.printStackTrace();
System.exit(1);
}
public static void main(String args[]) {
ds = new SQLMXDataSource();
ds.setUrl("jdbc:t4sqlmx://" + args[0] + ":11600/");
ds.setUser("super");
ds.setPassword(args[1]);
ds.setCatalog("SPM60");
ds.setSchema("RUV60");
ds.setMaxPoolSize(10);
ds.setMinPoolSize(5);
ds.setMaxStatements(10);
String filePath = args[2];
stmtExample();
}
现在您必须已经猜到在运行时捕获了filePath(在shellExec方法中使用),
java retest "dev.ind.pascal.com" "passwd" "dev/config/proc.sh"
但是当我在shellExec方法中调用这个filePath时: commands.add(&#34;文件路径&#34); 变量未展开,因此shellExec方法失败。请注意,双引号是强制性的。请告诉我如何实现这一目标。我试过了: commands.add(\&#34;文件路径\&#34) 但它仍然无效。请帮忙。
现在filePath每周都在不断变化,所以我不能在程序中对该值进行硬编码。
答案 0 :(得分:1)
您应该尝试从引号中删除filepath。该行将如下所示:
commands.add(filePath);
当您编写commands.add("filePath")
时,您没有传递变量 filePath 的值,而是传递值 filePath
我将filePath的值设置为&#34; C:/ test /我在这里&#34; 并得到以下回应:
Entering into the test shell loop
[C:/test/I am here]
答案 1 :(得分:1)
尝试
command.add("\"" + filepath + "\"");
答案 2 :(得分:1)
您需要将filePath
设为您班级的静态变量。在您的代码中,它是main
方法的局部变量,因此shellExec
方法无法访问。然后从"filePath"
方法中移除shellExec
中的引号,以便传递静态变量而不是String
"filePath"
。
class MyClass {
static String filePath;
public static void shellExec(){
try{
System.out.println("Entering into the test shell loop");
List<String> commands = new ArrayList<String>();
commands.add(filePath); //(filepath is the location of a file which contains various Unix command)
...
}
public static void main(String args[]) {
ds = new SQLMXDataSource();
ds.setUrl("jdbc:t4sqlmx://" + args[0] + ":11600/");
ds.setUser("super");
ds.setPassword(args[1]);
ds.setCatalog("SPM60");
ds.setSchema("RUV60");
ds.setMaxPoolSize(10);
ds.setMinPoolSize(5);
ds.setMaxStatements(10);
filePath = args[2];
stmtExample();
}
}
如果您需要在命令名前加filePath
,可以这样做:
commands.add("filePath " + filePath);
答案 3 :(得分:0)
尝试为filepath添加单引号,
command.add("'filepath'");