簡體   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