[英]Running commands in shell scripting
我有一个非常简单的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);
这可能会使终端认为自己已经完成了自己的工作,因此停止并关闭。 修复此问题的任何帮助都将受到赞赏。
本节重点介绍脚本本身的问题,并且不涉及同样是问题的Linux错误。 如果您以后要阅读此答案,并且在执行脚本时仅遇到问题,请参阅下面的“针对Linux,Nautilus用户的错误修复”部分或参阅此文章 。
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
运行它。
在发现作者脚本的问题后,该解决方案仍然无法正常工作,因为Kali Linux出现了“错误”,这与所有Linux发行版中Nautilus的错误有关。
要修复该错误,必须遵循“使脚本可执行”部分中的所有步骤以及下一个步骤。
Kali Linux的默认行为是在后台单击可执行的Shell脚本(从桌面或文件资源管理器运行)。
Nautilus(大多数Linux发行版中的默认文件浏览器)的默认行为是打开可执行的Shell脚本,以便在打开时进行编辑。
这解释了为什么当作者使用./script.sh
或bash ./script.sh
从终端运行脚本时,其脚本能完美工作的原因。
在执行“使脚本可执行”一节中的步骤之后,您需要在Nautilus中更改设置。 在这里找到了该解决方案,在此进行了更深入的讨论。
这是解决方案的要点:
通过打开任何文件夹或键入nautilus
打开文件浏览器Nautilus。 然后转到此菜单:
Edit → Preferences
然后转到“ Behavior
选项卡,在“ Executable Text Files
,选择“ Ask each time
。 对于非卡利用户,我认为您可以选择Run executable text...
作为默认选项。
必须将Kali配置为Ask each time
打开可执行外壳脚本Ask each time
,选择“运行可执行文本文件...” 将不起作用! 但是,我确实认为在其他发行版中,您可以选择“运行可执行文本文件...”作为默认行为。
在脚本内部,您正在通过在前台运行的脚本运行程序“ x-terminal-emulator”。 因此,它不会将控制权返回给主脚本。 如果您只想通过脚本运行Java程序,请从脚本中删除该程序。
#!/bin/sh
javac SomeJavaFile.java
java SomeJavaFile
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.