我有一个非常简单的shell脚本,用于编译和运行.java
文件。
#!/bin/sh
x-terminal-emulator
javac SomeJavaFile.java
java SomeJavaFile
但是,在触发Java
命令之前,此脚本似乎已停止。本质上,脚本可能看起来像这样
#!/bin/sh
x-terminal-emulator
我怎样才能解决这个问题?
修改
根据建议和答案,我的脚本现在看起来像这样
#!/bin/sh
x-terminal-emulator -e "javac DropboxStatusLoop.java && java DropboxStatusLoop"
然而它打开然后立即关闭。我觉得这很奇怪,因为我的代码中有一个循环。
非常简单,我的代码看起来像这样
import java.lang.*;
public class SomeJavaFile {
public static void main(String[] args) {
for(long i = 0; ; i++) {
try {
System.out.println("Hi");
Thread.sleep(1000);
} catch (Exception e) {
System.out.println(e);
}
}
}
}
手动完成后,它可以正确编译和运行,但是,它与前面提到的终端打开和关闭有同样的问题。我相信这是因为Thread.sleep(1000);
可能会让终端认为它已经完成了它正在做的事情所以它停止和关闭。任何帮助解决这个问题都是值得赞赏的。
答案 0 :(得分:4)
本节重点介绍了脚本本身的问题,并没有触及Linux上也存在问题的bug。如果您以后正在阅读此答案,并且您只是在执行脚本时遇到问题,请参阅下面的" Linux修复程序,Nautilus用户" 或查看{{ 3}}
x-terminal-emulator
,它会打开终端的新实例,然后等待该进程完成后再继续。没有任何东西会让它完成,它只会打开并等待。 Java
编译和运行命令不会传递给x-terminal-emulator
,而只是脚本中x-terminal-emulator
完成运行后执行的命令。
command1 && command2
。这样,command2
仅在command1
成功时运行。要传递Java
命令以在x-terminal-emulator
中投放,请使用-e
选项,如下所示:
x-terminal-emulator -e "javac SomeJavaFile.java && java SomeJavaFile"
这会将命令发送到x-terminal-emulator
。
x-terminal-emulator
。 只需从脚本中删除该行,以便整个脚本变为:
#!/bin/sh
javac SomeJavaFile.java
java SomeJavaFile
bash
或sh
命令从终端运行。要通过双击其图标或键入./script.sh
来运行脚本,您需要:
chmod +x script.sh
其中script.sh
是脚本文件的名称。
chmod +x myScript.sh
包括" she-bang"脚本文件顶部的行:
#!/bin/bash
然后,您可以双击其图标,或使用./myScript.sh
运行它。
在找到作者脚本的问题后,解决方案仍然无效,原因是" bug"与Kali Linux一起,与所有Linux发行版中的Nautilus错误有关。
要修复错误,请执行以下步骤:#34;使脚本可执行"必须遵循一节,以及下一节。
Kali Linux的默认行为是在后台运行可执行shell脚本(如果它们被单击(从桌面或文件浏览器运行))。
Nautilus(大多数Linux发行版中的默认文件浏览器)的默认行为是打开可执行shell脚本,以便在打开时进行编辑。
这解释了为什么作者的脚本在使用./script.sh
或bash ./script.sh
从终端运行时效果很好。
按照“#34;使脚本可执行文件"”部分中的步骤操作后,您需要更改Nautilus中的设置。找到了这个解决方案this post,更深入地讨论了这个问题。
以下是解决方案的要点:
打开文件资源管理器Nautilus,打开任何文件夹或输入nautilus
。然后转到此菜单:
Edit → Preferences
然后转到Behavior
标签,在Executable Text Files
下,选择 Ask each time
。对于非Kali用户,我认为您可以选择Run executable text...
作为默认选项。
Kali必须配置为 Ask each time
打开的可执行shell脚本,选择"运行可执行文本文件..." 不起作用!但是,我确实认为与其他发行版一样,您可以选择"运行可执行文本文件...."是默认行为。
答案 1 :(得分:2)
在脚本内部,您正在运行一个程序" x-terminal-emulator"通过在前台运行的脚本。 因此它不会将控制权返回给主脚本。 如果您只是想通过脚本运行java程序,请从脚本中删除该程序。
#!/bin/sh
javac SomeJavaFile.java
java SomeJavaFile