2008-10-22 5 views
2

My $ SHELL은 tcsh입니다. 매번 변경된 인수를 사용하여 여러 번 프로그램을 호출하는 C 셸 스크립트를 실행하고 싶습니다. 전화해야하는 프로그램은 포트란에 있습니다. 나는 그것을 편집하고 싶지 않다. 프로그램은 일단 실행되면 인수 만 받지만 명령 행에서는 인수를 사용하지 않습니다. 스크립트에서 프로그램을 호출하면 프로그램이 제어권을 갖습니다 (현재 멈춰있는 곳입니다. 프로그램 프로세스가 끝날 때까지 스크립트가 아무 것도 실행하지 않으므로 나갈 수는 없습니다). 이 시점에서 몇 가지 변수를 전달해야합니다. 몇 차례 반복 한 후에 프로그램에서 Ctrl-C를 눌러 스크립트를 계속 진행해야합니다.C 셸 : 명령 줄 인수가 아닌 프로그램을 실행하는 방법은 무엇입니까?

어떻게이 작업을 수행 할 수 있습니까?

+0

숙제일까요? –

+0

아니요, 코드를 작성하는 것과 관련된 모든 연구가 물리학에서만 이루어지는 연구를 시도 할 때 Finner CS 세부 사항을 놓치게됩니다. 이렇게 많은 사람들이 살아가는 코딩에 대한 역방향 접근법. – Alex

답변

5

@Toybuilder가 말한 것에 덧붙이면 "here document"를 사용할 수 있습니다. 나는. 스크립트는 "<<EOF"과 "EOF"사이

./myfortranprogram << EOF 
first line of input 
second line of input 
EOF 

모든 프로그램의 표준 입력에 공급된다 가질 수있다 (포트란은 아직 사용합니까 "(5 읽기를, *)"표준 입력에서 읽어?)

내가 ephemient의 코멘트가 대답 할 가치가 @ 생각하기 때문에 :

좀 더 팁 : < <는 'EOF'는 여기-문서의 본문에 보간을 방지; < < -EOF는 모든 앞쪽에있는 탭을 제거합니다. 따라서 이 여기에 들여 쓰기되어 과 일치하도록 만들 수 있으며, EOF는 을 토큰으로 바꿀 수 있습니다. 빈 토큰 (< < "")은 첫 번째 빈 줄에서 을 중지하는 here-doc를 나타냅니다.

나는 그 휴대용 것들이 얼마나 확실하지 않거나 그냥 tcsh 확장 일 경우 - <<EOF "here document"유형만을 사용했습니다.

+0

몇 가지 추가 팁 : << 'EOF'는 here-doc 본문에서 보간을 방지합니다. << - EOF는 모든 선행 탭을 제거하므로 (이 문서를 둘러 쌀 수있어 그 환경과 일치하도록), EOF는 모든 토큰으로 대체 될 수 있습니다. 빈 토큰 (<< "")은 첫 번째 빈 줄에서 멈추는 here-doc를 나타냅니다. – ephemient

0

사용자가 아니지만 프로그램이 실행되면 stdin을 통해 명령을 읽은 다음 쉘 리디렉션 <을 사용하여 필요한 명령을 제공 할 수 있습니다. &으로 백그라운드에서 실행하면 실행될 때 차단되지 않습니다. 그런 다음 sleep을 조금만 입력 한 다음 도구 도구 (ps, grep, awk 등)를 사용하여 프로그램의 PID를 찾은 다음 kill을 사용하여 SIGTERM을 보내고 ctrl-c를 입력하면됩니다.

1

음, 리디렉션으로 포트란 코드를 제공 할 수 있습니까? 입력으로 임시 파일을 만든 다음 stdin 리디렉션 (<)으로 파이프 할 수 있습니다.

2

사용하려는 것은 Expect입니다.

+0

아, 나는 Expect에 대해 잊어 버렸다! 우수 답변! – Toybuilder

0

이것은 유닉스 프로그램 expect의 직업입니다.이 프로그램은 멋지고 쉽게 대화식으로 프로그램을 명령하고 프롬프트에 응답 할 수 있습니다.

0

내 질문에 대한 답변을받은 후 여기로 보내졌습니다.

FWIW, 나는 csh C 쉘 스크립트와 비슷한 문제가있었습니다.

코드의이 비트는 custom_command는 모든 입력 인수받지 않고 수행 할 수있게되었다

foreach f ($forecastTimes) 
    custom_command << EOF 
     arg1=x$f;2 
     arg2=ya 
     arg3=z,z$f 
     run 
     exit 
     EOF 
end 

그것은 내가 그것을 시도 처음 작동하지 않았다,하지만 난에 공백 모두를 backspaced 후 코드의 해당 섹션에서 "< <"과 "EOF"사이의 공백을 제거했습니다. 나는 또한 닫는 "EOF"를 왼쪽 여백까지 백 스페이스했다. 그 후 작동 :

foreach f ($forecastTimes) 
    custom_command <<EOF 
     arg1=x$f;2 
     arg2=ya 
     arg3=z,z$f 
     run 
     exit 
EOF 
end 
관련 문제