2012-01-08 6 views
0

私はプロセスを殺す、scp経由でファイルをコピーする、ssh経由でリモートコマンドを実行するなどのさまざまなコマンドを実行するシェルスクリプトを持っています...シェルコマンドで構成されたプログラムをjavaで記述する必要がありますか?

このスクリプトは維持しにくく、テスト。 さらに、私は将来、xmlの設定ファイルで動作するように変更したいと思っています。シェルスクリプトを使って簡単に行うことはできません。 それをJavaアプリケーションに変換したいのですが、ProcessBuilderで多くのコマンドを実行するだけでは、正しくは感じられません。

一方、現在のシェルコマンド(java sshクライアント、Linuxプロセス用のJava APIなど)で簡単に解決できる「問題」ごとにJavaソリューションを検索することも正しいとは限りません。

編集: 私のプログラムはLinux環境で動作するので、クロスプラットフォームはここでは問題ではありません。

提案がありますか?

+1

メンテナンスが難しい理由は、基本機能を中心に「すべてやる」ラッパーです。私の意見では、特定のユースケースを中心に(例外処理とjunitテストを含む)完全なアプリケーションをコーディングするほうがいいでしょうし、特定の保守タスクのための限定されたシェルスクリプトを保持することもできます。 –

+0

/bin/shは_lot_を実行できます。設定を変数の単純なリストとして保持できる場合は、 "source"/""と呼ぶことができます。 XMLファイルがある場合は、XSLTスクリプトを記述して変数のリストを作成します。 –

答えて

5

シェルスクリプトには多くの言語が使用されています。 Python、PHP、Javaから -という正しいツールを使ってに戻ってきます。

Linuxの世界では、通常、bashスクリプトは十分強力で、perlには多くの優れたOSサポートがあります。

これまでの開発者の中には、実際にはbashスクリプトで機能を構築したり、状態を把握したり、通常どおりのことを管理したりすることができます。それはちょうど別の言語ですが、コマンドラインはその中心にあります。

UPDATE:私は追加したい

もう一つは、このケースでは、システムを管理するものは期待するものであることを、コードを書く必要があることを意味し、少なくとも驚き原則に従っています。すべてのJavaプログラマは、システム管理者ではなく、Javaプログラマのように配備していることがよくあります。これらのスクリプトをシステム管理者/操作の役割に渡す場合、コンパイルしなければならないJavaプログラムよりもシェルスクリプトに精通している可能性があります。

もう1つ注意してください - シェルスクリプトを適切なコードのように扱います。ソース管理(私の全体/ etcはGit管理の下にあります)に入れ、バグ追跡システムなどを持っています。メンテナンスを多くにしています。

+0

返事をありがとう。 bashスクリプトの単体テストはどうやって行いますか?そして、スクリプトが現在行っているタスクの1つでは、特定のJavaプログラムを実行する別のスクリプトを呼び出すと仮定して、どのようにエラーをキャッチしますか? – AAaa

+0

UNIXで - 他のすべてのことが終了コードによってどのように行われるかを処理します。 http://www.slac.stanford.edu/BFROOT/www/Computing/Environment/Tools/Batch/exitcode.html –

+1

TDDとBashはこれまでに何度も答えられています。ここにはhttp:// stackoverflowがあります。com/questions/1315624/bash-and-test-driven-development - シェルスクリプトのテストでは、通常、bashに関係なく、テストするのが最も難しいプロセスとのやりとりが重要です/または他の言語。 –

1

それは私にはJavaがシェルスクリプトのために非常に良いではありませんが、(Javaのに基づいています)Groovyのは、書くとmantainする方がよいかもしれない、とJava

http://groovy.codehaus.org/Running

+0

どのように 'sqlplus $ USER @ $ INSTANCE @ $ file |を呼び出すのですか? awk '{print $ 2}' 'をグルービーから? – alf

+1

http://groovy.codehaus.org/Executing+External+Processes+From+Groovy –

1

と完全に互換性がありますシェルスクリプトの使いやすさと、コードの保守とテストの機能を必要としながら、言語内でより高いレベルのタスクを実行できるように思えます。

幸いにも、それは動的言語が輝く場所(スクリプト言語とも呼ばれます)です。私の個人的な好みの順番で、PythonRubyPerlGroovy、およびa few othersがあります。

+0

あなたの意見では、どれが学習曲線が最も小さいですか? – AAaa

+0

@Antti:Perl以外の誰かが、コマンドラインをサポートしていて、家を回る必要がない場所を見つけましたか?私はそれらの大部分を試してきましたが、シェルスクリプトを書くのと同じくらい単純なものは見つけられませんでした。 –

+1

私の意見ではPythonの学習曲線は最小です。シェルスクリプトがより簡単なケースがあるのは事実ですが、他方では、 Pythonは数百行以上のスクリプトを書くときにずっと快適です。 – Antti

0

「ユニットテスト」のシェルスクリプトの考え方は、制御された環境でスクリプトを実行するラッパースクリプトを用意することです。つまり、実行したくない実際のコマンドを「模擬する」関数を定義することです(例えば、ssh() { })。

これにより、あなたが興味を持っている他のプロセスを気にせずに、興味のあるインタラクションをテストすることができます。これはまだよく設計された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 

単位のテスター:

$ /tmp/grep.sh 
This is a test 

をしかし、unittestのスクリプト内から実行する場合:今

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

grep() { 
    echo "Mock GREP result" 
} 

. "[email protected]" 

我々は直接grep.shを実行する場合は、それが期待通りに検索grepは関数によって嘲笑されます:

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

検証しようとしている動作をテストすることができます。

これには、同じシェル(.コマンド)から実行する必要があるなど、いくつかの制限事項があります。つまり、スクリプトが別のスクリプトを呼び出すと、再び実際のコマンドが呼び出されます。

代わりに、ユニットテストディレクトリに一連のスクリプトを定義することもできます。

$ ls /usr/local/unitbin 
grep 
ssh 
svn 

は次に例えば、ユニット・テスト・スクリプトは、スクリプトが実行されますから、PATHを変更する必要があり:

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

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

これは、順番に他のスクリプトを呼び出すスクリプトのために働く必要があります。


これらの例のいずれも、私が言ったように、少しばかげている、と彼らは価値があるならよりも潜在的に多くの問題。私は間違いなく、この経路を検討する前に、この質問に対する他の答えを見ていきます。しかし、単体テストにしたいが、サンドボックスで安全に実行できないbashコードがあれば、これらのオプションの1つが役に立つかもしれません。

関連する問題