所以我有一个客户端和一个服务器Java程序。客户端使用Java processbuilder来执行脚本但我的问题是用户输入需要传递给bash脚本的信息。所以,基本上,我需要知道如何将三个不同的字符串发送到bash脚本正在读取的三个不同变量。这个脚本正在复制一个文件,所以我宁愿不用java创建一个txt文件,让脚本读取文件。我还想要一种能够在OS X和Windows上运行的方法,以便进行改进。我目前在Ubuntu上使用Java 7。
以下是我要做的事情的片段: 的.java
Scanner bob = new Scanner(System.in);
String workingDirectory = new String(System.getProperty("user.dir"));
File tempDir = new File(workingDirectory);
String script = new String(workingDirectory + "/copyjava.sh");
System.out.print("Designate the location of the file: ");
String loc = bob.next();
System.out.print("Type the name of the file w/ extension: ");
String name = bob.next();
System.out.print("What is the location of THIS file? "); //I know there is a way to do this automagically but I can't remember how...
String wkspace = bob.next();
ProcessBuilder pb = new ProcessBuilder( script, loc, name, wkspace);
pb.start();
File myFile = new File (name);
脚本:
read loc
read name
read wkspace
cd $LOC
cp $name $wkspace
答案 0 :(得分:1)
您的shell脚本存在问题。 read
命令从stdin读取,但您将输入作为参数传递。您还在更改loc变量的大小写。 shell中的变量区分大小写。将脚本更改为以下内容:
#!/bin/sh
loc=$1
name=$2
wkspace=$3
cd "$loc" || { printf 'failed to cd to %s\n' "$loc" ; exit 1; }
cp "$name" "$wkspace" || { printf 'failed to copy %s\n' "$name" ; exit 1; }
另外,您不需要调用用其他语言编写的外部脚本来复制文件。你应该在java中实现它。在java中实现它也将为您的代码提供所需的平台独立性。
答案 1 :(得分:0)
您正在命令行传递args但是从脚本中的stdin读取。如何将脚本更改为:
cd $1
cp $2 $3
答案 2 :(得分:0)
我没有看到任何客户端/服务器交互,但让我们关注真正重要的事情:您正在将参数传递给脚本,但您的脚本正在尝试从标准输入中读取它们。
要解决您的问题,请按以下步骤修改脚本:
#!/bin/sh
LOC=$1
name=$2
wkspace=$3
cd $LOC
cp $name $wkspace
查看documentation了解更多详情。
但是没有做任何真正需要系统特定脚本文件的事情。复制文件的最佳方法是使用Java提供的自己的机制,然后您不必担心底层操作系统。
如果继续使用该脚本,那么您将需要另一个用于Windows系统的脚本,然后根据os.name
系统属性的值决定应该运行哪个脚本。