繁体   English   中英

在Shell脚本中运行命令

[英]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完成运行后执行。

  • 另外,由于除非成功编译就不要运行Java程序,所以应该像这样将命令链接在一起: 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
  • 您必须确保已遵循使外壳脚本可执行的步骤,否则必须使用bashsh命令从终端运行该脚本。

使脚本可执行

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

chmod +x script.sh

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

chmod +x myScript.sh

并在脚本文件顶部添加“ she-bang”行:

#!/bin/bash

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


适用于Linux和Nautilus用户的错误修复

在发现作者脚本的问题后,该解决方案仍然无法正常工作,因为Kali Linux出现了“错误”,这与所有Linux发行版中Nautilus的错误有关。

要修复该错误,必须遵循“使脚本可执行”部分中的所有步骤以及下一个步骤。

有什么问题

Kali Linux的默认行为是在后台单击可执行的Shell脚本(从桌面或文件资源管理器运行)。

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

这解释了为什么当作者使用./script.shbash ./script.sh从终端运行脚本时,其脚本能完美工作的原因。

解决方法

在执行“使脚本可执行”一节中的步骤之后,您需要在Nautilus中更改设置。 这里找到该解决方案,在此进行了更深入的讨论。

这是解决方案的要点:

  • 通过打开任何文件夹或键入nautilus打开文件浏览器Nautilus。 然后转到此菜单:

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

Nautilus GUI显示在哪里可以找到“每次询问”选项

必须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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM