2011-05-05 1 views
1

내가 Java5를 사용하고 내가 클래스 경로에있는 각 .jar 파일을 가리 키도록 싶지 않아 그래서 나는 작은 쉘 스크립트 작성 시도했다 :유닉스 쉘 님의 디렉토리 이름으로 파일을 돌려 ':'로 구분 된 클래스 경로

find $LIB_DIR -name '*.jar' -print > /tmp/classpath 
CP= 
cat /tmp/classpath | while read line 
do 
CP=$CP:$line 
done 
rm -f /tmp/classpath 

는하지만이 작동하지 않습니다 - $의 CP 변수가 비어 있습니다. ':'결과 $의 CP로

에 의해 구분하는 Pathes 단일 문자열이어야한다

사람이 여기에 잘못이며 어떻게 정확하게 하나의 문자열로 모든 파일의 라인을 연결하는 것을 알고 있습니까?

답변

5

귀하의 while 루프는 서브 쉘에있는, 그래서 변수는 다시 메인 쉘에 전달되지 않습니다. 당신은 어쨌든 이와 같은 것을하고 싶습니다 :

CP=$(find $LIB_DIR -name '*.jar' -print | tr '\n' ':') 

모두 한 줄에 원하는대로 할 수 있습니다.

+0

감사합니다) 내가 – nahab

+2

을 필요 정확히 sed를 S/: $ //이 후행 콜론을 제거하기 위해 추가 할 수 있습니다. '| SED의 : TR'\ n '을'| – ceving

+0

아마 당신은 그의 인해 –

1

문제 while 루프가 별도 쉘 인스턴스에서 실행하고있는 로컬 변수 ($CP)가 외부 쉘에 사용할 수 없다는 것이다. 작동해야

while read line; do 
    CP="$CP:$line" 
done < /tmp/classpath 

같은

뭔가. 그러나 $CP은 첫 번째 문자가 콜론으로 끝나기 때문에 약간의 사후 처리가 필요합니다.

또한 mktemp을 사용해야합니다. 다른 사람이 /tmp/classpath에 심볼릭 링크를 걸면 파일을 덮어 쓸 수 있습니다.

0

것은 분명히하려면 우베 클라 이네 - 코니와 스티브 베이커는 말했다 동안-DO-수행의 성격 때문이 아니라이 코드 블록 Bash man page에서

cat /tmp/classpath | while read line 
do 
CP=$CP:$line 
done 

파이프 사용의 서브 쉘되지 않은 블록 : "각 명령은 파이프 라인에서 별도의 프로세스 (즉, 서브 셸에서)로 실행됩니다. " subshells에 대한

더.

another SO answer 파이프와 서브 쉘에 대한 참조하십시오.

enter link description here

관련 문제