2012-01-08 4 views
0

나는 프로세스를 죽이고 scp를 통해 파일을 복사하고 ssh 등을 통해 원격 명령을 수행하는 등의 다양한 명령을 실행하는 쉘 스크립트를 가지고있다.셸 명령으로 구성된 프로그램을 java로 작성해야합니까?

이 스크립트는 유지하기 어렵고 단위 테스트. 또한, 장래에 xml 설정 파일과 함께 작동하도록 변경하고 싶습니다. 쉘 스크립트를 사용하여 쉽게 할 수 있다고 생각합니다. 그래서 자바 애플리케이션으로 변환하고 싶지만 ProcessBuilder로 많은 명령을 실행하는 것이 옳다고 생각하지 않습니다.

한편, 오늘날 ("java ssh 클라이언트", "Linux 프로세스 용 Java API"등) 셸 명령에서 쉽게 해결할 수있는 "문제"마다 Java 솔루션을 검색하는 것도 옳은 생각입니다.

EDIT : 내 프로그램이 리눅스 환경에서 실행된다는 것을 알고 있습니다. 따라서 크로스 플랫폼은 여기서 문제가되지 않습니다.

의견이 있으십니까?

+1

유지하기 어려운 이유는 기본 기능을 둘러싼 "모두 해"래퍼입니다. 제 생각에는 특정 유스 케이스를 중심으로 전체 애플리케이션 (예외 처리 및 junit 테스트 포함)을 코딩하는 것이 더 좋으며 특정 유지 보수 작업을위한 제한된 쉘 스크립트 세트를 유지하는 것이 좋습니다. –

+0

/bin/sh는 _lot_을 수행 할 수 있습니다. 설정을 변수의 일반 목록으로 유지할 수 있다면 "source"/ ""라고 부를 수 있습니다. XML 파일이 있으면 XSLT 스크립트를 작성하여 변수 목록을 작성하십시오. –

답변

5

저는 쉘 스크립팅에 많은 언어를 사용했습니다. 파이썬, PHP, Java에서 -에 맞는 도구를 사용하여 으로 계속 돌아 왔습니다.

리눅스 세계에서 bash 스크립팅은 일반적으로 충분히 강력하며 perl은 많은 훌륭한 OS를 지원합니다.

과거의 개발자 중 일부는 실제로 bash 스크립트에서 기능을 빌드하고 상태를 손쉽게 관리하며 일반적으로 기대하는 많은 기능을 관리 할 수 ​​있다는 사실에 놀랐습니다. 그것은 단지 다른 언어 일 뿐이지 만 명령 줄은 그 중심에 있습니다.

업데이트 : 추가 할 것

또 다른 것은이 경우에 당신이 코드는 그 시스템이 기대 관리를 무엇으로 작성해야한다는 것을 의미 적어도 놀랍게도원칙을 따라야한다. 너무 자주 자바 프로그래머가 시스템 관리자가 아닌 Java 프로그래머처럼 배포를 작성하는 것을 보았습니다. 이 스크립트를 시스템 관리자/운영 역할로 넘겨 주려면 컴파일해야하는 Java 프로그램보다 쉘 스크립트에 익숙 할 것입니다.

다른주의 사항 - 쉘 스크립트를 적절한 코드처럼 취급하십시오. 소스 제어 (내 전체/etc는 Git 관리하에있다.), 버그 추적 시스템 등을 가지고있다. 유지 보수가 좀 더 편리하다. .

+0

답장을 보내 주셔서 감사합니다. bash 스크립트의 단위 테스트는 어떻게 수행합니까? 그리고 스크립트가 오늘하는 작업 중 하나가 주어진 java 프로그램을 실행하는 또 다른 스크립트를 호출한다고 가정하면 오류를 어떻게 잡을 수 있습니까? – AAaa

+0

유닉스에서 다른 모든 것들이 종료 코드를 통해 어떻게 처리되는지 오류를 처리하십시오. http://www.slac.stanford.edu/BFROOT/www/Computing/Environment/Tools/Batch/exitcode.html –

+1

TDD와 Bash는 여러 번 해답을 얻었습니다. 여기에 하나 : http : // stackoverflow가 있습니다.co.kr/questions/1315624/bash-and-test-driven-development - 쉘 스크립트를 테스트 할 때 일반적으로 호출하는 프로세스와의 상호 작용이 bash에 있는지 여부에 관계없이 테스트하기가 가장 힘듭니다/또는 다른 언어. –

1

자바 쉘 스크립트에 대한 아주 좋은 것이 아니라 (자바 기반) 멋져요, 작성하고 mantain에 더 좋을 수도, 나를 여기에 자바

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

와 완벽하게 호환됩니다 언어 내에서 더 높은 수준의 작업을 수행하면서도 코드를 유지 관리하고 테스트 할 수있는 기능과 결합 된 쉘 스크립팅의 용이성이 필요한 것 같습니다.

운좋게도 동적 언어가 빛나는 곳 (스크립트 언어라고도 함)입니다. 내 개인 취향대로 Python, Ruby, Perl, Groovya few others이 있습니다.

+0

가장 작은 학습 곡선을 가진 귀하의 의견은 어느 것입니까? – AAaa

+0

@Antti : Perl 이외의 다른 명령 행렬을 사용하여 집안을 돌아 다니지 않아도되는 곳을 찾았습니까? 나는 그들 대부분을 시험해 보았고 쉘 스크립트를 작성하는 것과 똑같은 것을 발견하지 못했다. –

+1

Python은 제 생각에 가장 작은 학습 곡선을 가지고 있습니다. 쉘 스크립팅이 더 간단한 경우가 있지만 다른 한편으로는 예를 들어 파이썬은 몇 백 줄보다 긴 스크립트를 작성할 때 훨씬 편안합니다. – Antti

0

"단위 테스트"쉘 스크립트에 대한 약간의 상투적 인 아이디어는 제어 된 환경에서 스크립트를 실행하는 래퍼 스크립트를 사용하는 것입니다. 즉 실행하고 싶지 않은 실제 명령을 "조롱 (mock)"하는 기능을 정의하는 것입니다. (예 : 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 

을하지만 유닛 테스트 스크립트 내에서 실행하는 경우 : 이제

$ 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 코드가 있지만 샌드 박스에서 안전하게 실행할 수없는 경우이 옵션 중 하나가 유용 할 수 있습니다.

관련 문제