Linux 中相当于“cmd /C start "Title" "C:\Folder\file.bat"”

Linux 中相当于“cmd /C start "Title" "C:\Folder\file.bat"”

Runtime.getRuntime().exec()我有一个 Java 程序,它使用以下命令在 Windows 上运行批处理文件:

cmd /C start "Title" "C:\Folder\file.bat"

Java 程序很快结束,因为cmd /C执行命令然后终止 (1)start "Title" "C:\Folder\file.bat" 开始批处理脚本 (2)。因此该进程(批处理文件)将继续运行独立

现在,假设我有一个 shell 脚本(例如file.sh),我想从 Java 启动它,它有类似的行为。它怎么可能是等效命令 (3)在 Linux 中?


笔记

  1. CMD.exe(命令 Shell)| Windows CMD | SS64.com
  2. 开始 - 启动程序 | Windows CMD | SS64.com
  3. 标题 ("Title") 不需要。

答案1

启动脚本的方法是给出其路径:

/path/to/script.sh

如果父进程退出,要让它继续运行,您可以通过附加以下内容在后台启动它&

/path/to/script.sh &

因此,例如,如果你有一个脚本调用另一个脚本,如下所示:

#!/bin/bash
script2.sh &

您可以运行script1.sh它将调用script2.sh,并且由于它被发送到后台,所以立即退出。

答案2

Linux 中执行脚本的各种方法:我的任意脚本名称是 foo.bat

例1:$bash foo.bat

示例2:$./foo.bat

例3:$echo $(~/Desktop/foo.bat)

ex4:`~/Desktop/foo.bat`

ex5:$ /path/to/shell/script/foo.bat

ex1:这只是一个普通文件,我们用 bash 执行它
ex2:我们已将 foo.bat 标记为可执行文件。($chmod +x foo.bat)
ex3:命令替换
ex4:使用“``”执行
ex5:我们使用可执行文件的路径。

这些是最常见的。我会避免调用 gnome-terminal 和 xterm 之类的东西。与 bash 和 sh 之类的东西相比,这些 shell 不太常见。例如,我使用 Ubuntu mate。我既没有 xterm 也没有 gnome-terminal。但是,我有 bash 和 sh。几乎所有运行 Linux / mac osx 的人都有。

你可能会喜欢这个关于脚本执行的教程这里

脚本 foo.bat 执行以下操作:

$ ./foo.bat
Having a bash ./foo.bat

其内容如下:

$ cat foo.bat 
#!/bin/bash
echo -e "Having a bash" $0

我认为使用 $0 可以为您提供所需的标题功能。还有更多可能性。

答案3

据我了解,您想在 Java 内部运行外部命令,并让 Java 进程继续(异步)运行,同时该外部命令也继续运行?

以下是我进行的一个小测试:

[tai@flenux runproc ] $ ls
filecreator.sh  ProcRunner.class  ProcRunner.java

[tai@flenux runproc ] $ cat filecreator.sh 
touch newfile

[tai@flenux runproc ] $ cat ProcRunner.java 

public class ProcRunner {
    public static void main(String[] args) {
        try {
            Runtime.getRuntime().exec(args);
            Thread.sleep(2000);
            System.out.println("Done");
        } catch(Exception e) {
            System.err.println(e.toString() );
        }
    }
}

[tai@flenux runproc ] $ java ProcRunner bash filecreator.sh 
Done

[tai@flenux runproc ] $ ls
filecreator.sh  newfile  ProcRunner.class  ProcRunner.java

[tai@flenux runproc ] $ 

Java 成功执行了该程序(只是创建了“newfile”文件);在调用 exec 之后,它还继续以自己的方式愉快地打印 Done 消息。

如果您还想打开终端窗口,请在调用字符串前加上前缀

Runtime.getRuntime().exec(["gnome-terminal", "-e"]+args);

因此,要回答您的问题,看起来您只需调用您指定的方法即可。您是否得到了不同的行为?

答案4

你有很多选择,其中比较有趣的是:

  • 如果是 Ubuntu,你可以使用gnome-terminal

    gnome-terminal -c "/home/$USER/file.sh" -t "Title"
    

    或者:

    gnome-terminal -- "/home/$USER/file.sh" -t "Title"
    
  • 如果您想使其与大多数 Linux 兼容,您可以使用xterm

    xterm -T "Title" -e "/home/$USER/file.sh"
    

路径是/home/$USER/file.sh(Windows 7 等效C:\Users\%UserProfile%\file.bat:)

内容file.sh可能是这样的:

#!/bin/bash

echo "In a World without Walls nor Fences, the people don't need Windows and Gates"
sleep 2

相关内容