在shell脚本中运行命令

时间:2016-04-18 17:00:29

标签: java linux shell

我有一个非常简单的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);可能会让终端认为它已经完成了它正在做的事情所以它停止和关闭。任何帮助解决这个问题都是值得赞赏的。

2 个答案:

答案 0 :(得分:4)

脚本修复

本节重点介绍了脚本本身的问题,并没有触及Linux上也存在问题的bug。如果您以后正在阅读此答案,并且您只是在执行脚本时遇到问题,请参阅下面的" Linux修复程序,Nautilus用户" 或查看{{ 3}}

  • 问题是您的脚本将运行x-terminal-emulator,它会打开终端的新实例,然后等待该进程完成后再继续。没有任何东西会让它完成,它只会打开并等待。

Java编译和运行命令不会传递给x-terminal-emulator,而只是脚本中x-terminal-emulator完成运行后执行的命令。

  • 此外,由于您不想运行java程序,除非它成功编译,您应该将命令链接在一起,如下所示:command1 && command2。这样,command2仅在command1成功时运行。

要传递Java命令以在x-terminal-emulator中投放,请使用-e选项,如下所示:

x-terminal-emulator -e "javac SomeJavaFile.java && java SomeJavaFile"

这会将命令发送到x-terminal-emulator

  • 除非您特别想在此程序运行时打开另一个 shell,否则您很可能不想使用x-terminal-emulator

只需从脚本中删除该行,以便整个脚本变为:

#!/bin/sh
javac SomeJavaFile.java
java SomeJavaFile
  • 您必须确保已按照步骤使shell脚本可执行,否则必须使用bashsh命令从终端运行。

使脚本可执行

要通过双击其图标或键入./script.sh来运行脚本,您需要:

chmod +x script.sh

其中script.sh是脚本文件的名称。

chmod +x myScript.sh

包括" she-bang"脚本文件顶部的行:

#!/bin/bash

然后,您可以双击其图标,或使用./myScript.sh运行它。

Linux修复程序,Nautilus用户

在找到作者脚本的问题后,解决方案仍然无效,原因是" bug"与Kali Linux一起,与所有Linux发行版中的Nautilus错误有关。

要修复错误,请执行以下步骤:#34;使脚本可执行"必须遵循一节,以及下一节。

问题是什么?

Kali Linux的默认行为是在后台运行可执行shell脚本(如果它们被单击(从桌面或文件浏览器运行))。

Nautilus(大多数Linux发行版中的默认文件浏览器)的默认行为是打开可执行shell脚本,以便在打开时进行编辑。

这解释了为什么作者的脚本在使用./script.shbash ./script.sh从终端运行时效果很好。

修复

按照“#34;使脚本可执行文件"”部分中的步骤操作后,您需要更改Nautilus中的设置。找到了这个解决方案this post,更深入地讨论了这个问题。

以下是解决方案的要点:

  • 打开文件资源管理器Nautilus,打开任何文件夹或输入nautilus。然后转到此菜单:

    Edit → Preferences
    
  • 然后转到Behavior标签,在Executable Text Files下,选择 Ask each time 。对于非Kali用户,我认为您可以选择Run executable text...作为默认选项。

here

Kali必须配置为 Ask each time 打开的可执行shell脚本,选择"运行可执行文本文件..." 不起作用!但是,我确实认为与其他发行版一样,您可以选择"运行可执行文本文件...."是默认行为。

答案 1 :(得分:2)

在脚本内部,您正在运行一个程序" x-terminal-emulator"通过在前台运行的脚本。 因此它不会将控制权返回给主脚本。 如果您只是想通过脚本运行java程序,请从脚本中删除该程序。

#!/bin/sh
javac SomeJavaFile.java
java SomeJavaFile