0

所以我有一个客户端和一个服务器 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
4

3 回答 3

1

你的 shell 脚本有问题。该read命令从标准输入读取,但您将输入作为参数传递。您还在更改 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 中实现这一点也会给你的代码你想要的平台独立性。

于 2012-07-25T23:39:30.200 回答
0

您在命令行上传递参数,但从脚本中的标准输入读取。如何将脚本更改为:

cd $1

cp $2 $3
于 2012-07-25T23:37:26.807 回答
0

我没有看到任何客户端/服务器交互,但让我们关注真正重要的事情:您正在将参数传递给脚本,但您的脚本正试图从标准输入中读取它们。

要解决您的问题,请按如下方式修改您的脚本:

#!/bin/sh
LOC=$1
name=$2
wkspace=$3

cd $LOC

cp $name $wkspace

查看文档以获取更多详细信息。

但是没有做任何真正需要特定于系统的脚本文件的事情。复制文件的最佳方式是使用 Java 提供的自己的机制,这样您就无需担心底层操作系统。

如果您继续使用该脚本,那么您将需要另一个用于 Windows 系统的脚本,然后根据os.name系统属性的值决定您应该运行哪个脚本。

于 2012-07-25T23:39:13.683 回答