쉘 스크립트를 사용하여 자동으로 C 프로그램에 입력을 보내는 방법을 발견했습니다. 예를 들어, 다음 C 프로그램을 컴파일하면:
//test.c
int main()
}
int x;
printf("Please enter an integer:");
scanf("%d", &x);
printf("\nYou entered %d\n", x);
}
그리고 다음 스크립트를 작성하세요:
#!/bin/bash
./test << EOF
5
EOF
터미널을 열고 스크립트를 실행하면 다음과 같은 출력이 표시됩니다.
Please enter an integer:
You entered 5
이제 새 터미널에서 테스트를 실행하고 싶고 이 명령을 사용하여 이를 수행할 수 있다는 것을 알았습니다.
gnome-terminal -x ./test
문제는 두 가지를 모두 수행하려고 하면(새 터미널에서 테스트를 실행하고 입력을 자동으로 전송) 스크립트가 작동하지 않습니다. 입력이 새 터미널로 전송되지 않습니다. 평소처럼 직접 제공하면 됩니다.
내가 뭘 잘못하고 있고 어떻게 해결할 수 있나요?
PS 형식이 다소 혼란스럽다면 죄송합니다. 시도해 보았습니다.
답변1
바이너리 대신 쉘 스크립트를 사용하면 작동합니다.
$ ~/tmp/term_test$ cat ./test_wrapper.sh
#!/bin/bash
./test << EOF
5
EOF
read dummy
$ gnome-terminal -x ./test_wrapper.sh
$
내가 추가한 "더미 읽기" 줄은 스크립트가 완료되자마자 터미널이 닫히는 것을 방지합니다.
새 터미널 세션을 열어야 합니까?
답변2
나는 당신이 원하는 것을 달성할 수 있는 방법을 찾은 것 같지만 다소 혼란스러운 결과를 피하기 위해 리디렉션에 대해 알고 싶을 것이라고 생각합니다.
작업 제어(& - 백그라운드에서 실행)를 사용하여 동시에 2개의 인스턴스를 실행할 수 있습니다. 자세한 내용은 bash 매뉴얼 페이지를 참조하십시오. 거기에서 리디렉션에 대한 적용 범위도 찾을 수 있습니다.
즉시 종료되지 않도록 C 예제에 절전 모드를 추가했습니다. michael@bunchan:~/tmp/term_test$ echo 5 | ./test 정수를 입력하세요: 5를 입력했습니다. michael@bunchan:~/tmp/term_test$ echo 99999 | ./test 정수를 입력하세요: 99999 michael@ 번찬:~/tmp/term_test$
michael@bunchan:~/tmp/term_test$
$ cat test.c
//test.c
#include <stdio.h>
#include <unistd.h>
int main()
{
int x;
sleep(10);
printf("Please enter an integer:");
scanf("%d", &x); printf("\nYou entered %d\n", x);
}
$ ./test & << EOF
> 999
> EOF
[1] 10638
$ ./test & << EOF
5
EOF
[2] 10639
$ jobsPlease enter an integer:
[1]+ Stopped ./test
[2]- Running ./test &
$ Please enter an integer:jobs
[1]- Stopped ./test
[2]+ Stopped ./test
$
답변3
리디렉션 대신 파이프를 사용하면 원래 질문에 대한 더 나은 답변입니다.
$ echo 5 | ./test
Please enter an integer:
You entered 5
$ echo 99999 | ./test
Please enter an integer:
You entered 99999
$