2012-11-30 3 views
2

echo $()에서 bash 스크립트 호출을 래핑 할 때 매우 이상한 상황이 발생합니다. 이것은 어떤 코드를 나타낼 지 모르기 때문에 이상합니다. 그래서 일반적인 상황을 설명 할 것입니다. 나는 "run.sh"라고 부르는 스크립트를 가지고 있으며 출력이있다. 이것은 일반적으로 공백과 줄 바꿈으로 매우 정교하게 형식화됩니다.출력 중간에 나타나는 ls 내용

이 출력을 이전에 한 번 실행했을 때 얻은 값과 비교하려고합니다.

분명히
expression=$(./runProcess.sh "$process"); 
expected=$(cat UnitTests/expect-process-$process); 
if [ "$expression" == "$expected" ]; then 

내가 필요 미래 testings를 비교하는 것이 "오래된"의 값을 얻기 위해 이렇게하려면 코드는이 두 가지가 같은, 즉 있는지 확인하여 이전에 "새로운"값을 비교 손으로 $(./runProcess.sh)을 계산하십시오. 이렇게하면 공백이 훨씬 적은 출력 버전을 얻을 수 있습니다. 그러나 그것의 중간에 ls의 내용이 나타나기 때문에 분명히 잘못되었습니다.

./runProcess.sh g,g: 

R2With2Gluons = 

    + ncol*i_*pi_^2*A*g^2 * (
     - 17/24*d_(mu1,mu2)*d_(m1,m2)*p1.p1 
     - 31/8*d_(mu1,mu2)*d_(m1,m2)*p1.p2 
     - 17/24*d_(mu1,mu2)*d_(m1,m2)*p2.p2 
     + 7/12*d_(m1,m2)*p1(mu1)*p1(mu2) 
     + 1/24*d_(m1,m2)*p1(mu1)*p2(mu2) 
     + 89/24*d_(m1,m2)*p1(mu2)*p2(mu1) 
     + 7/12*d_(m1,m2)*p2(mu1)*p2(mu2) 
     ); 

0.01 sec out of 0.01 sec 


echo $(./runProcess.sh g,g): 
R2With3Gluons = + coeff(m1,m2,m3)*ncol*pi_^2*A*g^3 Auto Diagrams UnitTests colourCalc.frm form.set functions.frm output.frm process.frm process.mid qgraf2form.frm qgrafProcessor.py runProcess.sh runProcesses.sh test vertices.frm (+ 35/24*d_(mu1,mu2)*p1(mu3) - 35/24*d_(mu1,mu2)*p2(mu3) - 35/24*d_(mu1,mu3)*p1(mu2) + 35/24*d_(mu1,mu3)*p3(mu2) + 35/24*d_(mu2,mu3)*p2(mu1) - 35/24*d_(mu2,mu3)*p3(mu1)); 0.40 sec out of 0.40 sec 

그리고 여기가 LS입니다 : 그하여 나는이 두 명령을 실행 출력의 다음과 같은 유형을 얻을 수 있다는 것을 의미

ls: 
Auto    form.set   process.mid  runProcesses.sh 
Diagrams   functions.frm  qgraf2form.frm test 
UnitTests   output.frm  qgrafProcessor.py vertices.frm 
colourCalc.frm process.frm  runProcess.sh 

필요하다면 나는 정확한 예제를 제공 할 수 있습니다,하지만 난이 조명 희망 충분히. 왜 이런 일이 일어날 수 있습니까? OS X Mountain Lion에서 bash를 사용하고 있습니다.

+0

예, 당신이 정확한 예제를 제공한다 사용하십시오. –

+3

"ls 내용"? 물론 거기에'*'부동 문자가 없습니까? – cdarke

+0

출력을 환경 변수에 저장 하시겠습니까? 아니면 '오래된 것'입니까? –

답변

1

를 사용하여 더 따옴표!

보십시오 : 대신

echo "$(./run.sh)" 

. (예, 따옴표 포함).

시도 :

old=$(./run.sh) 
echo "$old" 

당신이 (인용 부호 $old으로) 올바른 출력을해야합니다. 이제 샘슨 - 첸에 의해 권고로, 테스트, 사용에 관한 :

[[ "$old" == "$(./run.sh)" ]] 

(당신이 일반적으로 당신을 변수 또는 명령 대체 변수 old을 할당 인용해야하지만하지 않습니다 매시) 따옴표를 사용할 수 있습니다. ((Gordon Davisson의이 글에 대한 훌륭한 논평 참조, 나는 실제로 upvoted했다. globs에 대한 몇 가지주의 사항과 [[ ... ]] 내의 변수를 인용 함)).

편집. 게시물을 편집 했으므로 비효율적 인 cat을 사용하고 있습니다. 대신에 :

expected=$(cat UnitTests/expect-process-$process) 

expected=$(< "UnitTests/expect-process-$process") 
+0

네, 여기 있습니다. Bash는 출력물의 * 중 하나를 폴더의 내용으로 확장 중입니다. 따옴표로,이 작업을 수행하지 않습니다! – VolatileStorm

+1

인용 부호는'[[...]]'안에 보통 * 필요하지 않습니다. 그러나 때때로 중요합니다 - 예를 들어'=='연산자는 따옴표로 묶지 않으면 오른쪽 피연산자를 패턴으로 처리합니다 (예 : '[[fred == f * d]]'는 참이지만'[[fred == "f * d"]]'는 그렇지 않습니다. 그럴 필요가없는 한, 이중 따옴표 붙이기 습관을 들기를 권장합니다. 그럴 필요가없는 한 모든 것을 제거하는 것이 안전합니다. –

+0

@GordonDavisson 변수와 명령 대체를 인용하는 것에 대해 이야기하고 있었는데, 사람들이 변수를 인용하는 것을 잊었 기 때문에 분명하다고 생각했습니다. 나는이 점에 관해서 나의 발언을 더 명확하게하려고 노력할 것이다. 그러나 나는 조건부 구조체 [[...]]'나 할당에서 변수와 명령 치환을 인용하지 않을 것이다. 죄송합니다. –

1

그것은 당신의 정확한 스크립트없이 말하기 어렵지만, 우선, 당신의 비교 :

old == $(./run.sh); 

은 다음과 같아야합니다

if [[ "$old" == "$(./run.sh)" ]]; then 
+0

이것은 실제 비교가 아니며 단지 컨텍스트의 바보를주기위한 것이다. 나는 실제 코드를 포스트로 바꿀 것이다. – VolatileStorm

+1

/idiot/idea/:-D – Faiz