쉘 스크립트를 사용하여 새 터미널에 입력을 보내는 방법

쉘 스크립트를 사용하여 새 터미널에 입력을 보내는 방법

쉘 스크립트를 사용하여 자동으로 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
$ 

관련 정보