2012-01-08 48 views
0

我有一個shell腳本,它執行各種命令,如查殺進程,通過scp複製文件,通過ssh執行遠程命令等...應該用java編寫一個由shell命令組成的程序嗎?

問題是這個腳本很難維護,測試。另外,我希望將來能夠改變它,以便它能夠與xml配置文件一起工作,並且我認爲它不能用shell腳本輕鬆完成。 所以,我想將它轉換爲一個Java應用程序,但只是用ProcessBuilder運行許多命令感覺不對。

另一方面,爲每個「問題」尋找java解決方案,今天很容易在shell命令中解決(如java ssh客戶端,用於linux進程的java API等),也感覺不對。

編輯: 我知道我的程序肯定會在linux環境下運行,所以跨平臺在這裏不是問題。

有什麼建議嗎?

+1

之所以說它是難以維持的是,它是圍繞基本功能的「做這一切的」包裝。在我看來,最好是針對特定用例編寫完整的應用程序(包括異常處理和junit測試),並可能爲特定維護任務保留一組有限的shell腳本。 – 2012-01-08 13:12:34

+0

/bin/sh可以做一個_lot_。如果你可以將你的配置保存爲一個簡單的變量列表,你可以調用「source」/「。」將其讀入。如果您有一個XML文件,請編寫一個XSLT腳本來創建變量列表。 – 2012-01-08 13:20:57

回答

5

我用shell腳本許多語言;從Python,PHP到Java - 我一直使用正確的工具回到

在Linux世界中時,bash腳本通常是足夠強大的,和Perl有很多很好的操作系統支持。

它感到驚訝我們的一些開發商在過去,你可以實際構建的bash腳本中的函數,手握住狀態和管理的很多東西你通常期望。這只是另一種語言,但命令行是它的核心。

UPDATE:

我想補充的另一件事是遵循最小驚訝,在這種情況下意味着你​​應該寫的代碼是什麼樣的管理系統所期望的原則。我經常看到Java程序員像Java程序員那樣編寫他們的部署,而不是系統管理員。如果您將這些腳本交給系統管理員/操作角色,那麼他們可能比他們需要編譯的Java程序更熟悉shell腳本。

在另一方面 - 把你的shell腳本一樣正確的代碼。把它放在源代碼管理中(我的整個/ etc都在Git管理下),有一個錯誤跟蹤系統等。這使得維護更容易

+0

感謝您的回覆。你將如何爲bash腳本執行單元測試?假如腳本今天所做的任務之一是調用另一個運行給定java程序的腳本,你會如何捕獲錯誤? – AAaa 2012-01-08 13:26:35

+0

處理錯誤unix中的所有其他事情 - 通過退出代碼。 http://www.slac.stanford.edu/BFROOT/www/Computing/Environment/Tools/Batch/exitcode.html – 2012-01-08 13:29:56

+1

TDD和Bash已經回答過很多次了,這裏是一個:HTTP://計算器。com/questions/1315624/bash-and-test-driven-development - 值得注意的是,通過測試shell腳本,通常與您呼叫的進程的交互是最難測試的,無論它是否在bash /或任何其他語言。 – 2012-01-08 13:31:13

1

Java是不是shell腳本相當不錯,但Groovy的(這是基於Java),可能會更好編寫和十個分量,以及與Java

http://groovy.codehaus.org/Running

+0

如何調用'sqlplus $ USER @ $ INSTANCE @ $ file | awk'{print $ 2}''從常規? – alf 2012-01-08 14:03:05

+1

http://groovy.codehaus.org/Executing+External+Processes+From+Groovy – 2012-01-08 14:14:48

1

完全兼容,對我來說,聽起來就像你需要shell腳本的簡易性以及維護和測試代碼的能力,同時仍然能夠在語言中完成一些更高級別的任務。

幸運的是,這正是動態語言閃耀(也稱爲腳本語言)。有(在我的個人偏好順序排列)PythonRubyPerlGroovya few others

+0

哪一個在你看來是最小的學習曲線? – AAaa 2012-01-08 13:20:00

+0

@Antti:你有沒有發現Perl以外的其他人有很好的命令行支持,你不需要在房子周圍?我已經嘗試了其中的大部分,並沒有發現像編寫shell腳本一樣簡單。 – 2012-01-08 13:24:39

+1

在我看來,Python擁有最小的學習曲線。的確,有些情況下shell腳本更直接,但另一方面,我發現例如編寫任何長度超過幾百行的腳本時,Python會更加舒適。 – Antti 2012-01-08 14:42:57

0

的「單元測試」 shell腳本將有一個包裹腳本,執行腳本在受控環境中的一個略顯輕率的想法 - 即它定義了「模擬」的真正命令你不想執行的功能(例如ssh() { })。

這將使你測試你感興趣的相互作用,而不用擔心你呼喚其他進程,如brainzzy描述。這仍然非常依賴於精心設計的bash代碼,但至少在理論上它可能,我想。

演示:

$ cat /tmp/grep.sh 
#!/bin/bash 

# Simple program that relies on grep 
echo -e "This is a test\nThis line doesn't match." | grep test 

單位計:

$ cat /tmp/unittest.sh 
#!/bin/bash 

grep() { 
    echo "Mock GREP result" 
} 

. "[email protected]" 

現在,如果我們直接運行grep.sh,它會搜索按預期:

$ /tmp/grep.sh 
This is a test 

但是,如果從單元測試腳本中運行grep被功能嘲笑:

$ /tmp/unittest.sh /tmp/grep.sh 
Mock GREP result 

允許我們測試我們試圖驗證的任何行爲。

這有幾個限制因素,例如需要從同一個shell(.命令)運行,這意味着如果腳本反過來調用其他腳本,它們將再次調用真實命令。

另一種方法是在一個單元測試目錄中,例如,以限定一組腳本

$ ls /usr/local/unitbin 
grep 
ssh 
svn 

然後讓單元測試腳本改變腳本運行的路徑,例如:

$ cat /tmp/unittest.sh 
#!/bin/bash 

PATH=/usr/local/unitbin:$PATH "[email protected]" 

這應該調用反過來其他腳本腳本。


這兩個例子,就像我說的,是有點可笑,而且可能更麻煩比他們的價值。在考慮這條道路之前,我一定會看看這個問題的其他答案。但是如果你有單元測試的bash代碼,但不能安全地在沙箱中運行,其中一個選項可能適用於你。

相關問題