[英]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.