쉘 스크립트를 일시 중지하려면 아무 키나 누르고, 다시 시작하려면 다시 누르십시오.

쉘 스크립트를 일시 중지하려면 아무 키나 누르고, 다시 시작하려면 다시 누르십시오.

나는 파일을 복사하고 각 파일 이후에 진행 상황을 에코하는 API를 테스트하기 위해 쉘 스크립트를 작성했습니다.

각 복사본 사이에는 2초의 대기 시간이 있으므로 보다 심층적인 테스트를 위해 아무 키나 눌러 스크립트를 일시 중지하는 기능을 추가하고 싶었습니다. 그런 다음 아무 키나 눌러 복원하십시오.

가능한 한 적은 줄에 어떻게 추가할 수 있나요?

답변1

스크립트에 아무것도 추가할 필요가 없습니다. 쉘은 이러한 기능을 허용합니다.

  • 터미널에서 스크립트를 시작합니다.
  • 실행 중 터미널 사용을 차단하는 중 ctrl- z. 터미널이 다시 해제되고 프로세스가 중지되었다는 메시지가 표시됩니다. (현재 진행중 상태 T, 중지됨)
  • 이제 원하는 대로 하세요. ctrl- 를 사용하여 다른 프로세스/스크립트를 시작하고 중지 할 수도 있습니다 z.
  • jobs터미널에 입력하거나 중지된 모든 작업을 나열하십시오.
  • 스크립트를 계속 진행하려면 fg(foreground)를 입력하세요. 작업을 포그라운드 프로세스 그룹으로 복원하고 작업은 계속 실행됩니다.

예를 살펴보세요:

root@host:~$ sleep 10 # sleep for 10 seconds
^Z
[1]+  Stopped                 sleep 10
root@host:~$ jobs # list all stopped jobs
[1]+  Stopped                 sleep 10
root@host:~$ fg # continue the job
sleep 10
root@host:~$ # job has finished

답변2

스크립트 내에 남아 있는 동안 스크립트를 일시 중지하려면 절전 대신 읽기를 사용할 수 있습니다.

당신은 그것을 사용할 수 있습니다

read -t
read -n스크립트를 계속하려면 한 문자를 읽도록 읽기 시간 제한을 설정하세요 (실제로는 아무 키나 누르기만 하면 됩니다).

아직 코드를 제공하지 않았으므로 사용 방법의 예는 다음과 같습니다.
q를 누르면 read -n1키를 누를 때까지 스크립트가 계속 진행되지 않습니다.
키를 누르면 검사가 재설정되고 스크립트는 평소대로 계속 반복됩니다.

while [[ true ]]; do
    read -t2 -n1 check
    if [[ $check == "q" ]];then
        echo "pressed"
        read -n1
        check=""
    else
        echo "not pressed"
    fi
echo "Doing Something"
done

입력이 화면 출력을 복잡하게 만드는 것을 방지하기 위해 stty -echo섹션의 시작과 끝에 추가할 수도 있습니다.stty echo

답변3

이를 사용하면 dd파일에서 개별 바이트를 안정적으로 읽을 수 있습니다. 터미널 읽기 및 출력을 10분의 1초로 제한하도록 바이트 수를 stty설정할 수 있습니다 . 나는 두 가지를 전혀 사용하지 않고 결합 하고 터미널의 읽기 시간 제한이 당신을 위해 작동하도록 놔둘 수 있다고 생각합니다.mintimesleep

s=$(stty -g </dev/tty)
(while stty raw -echo isig time 20 min 0;test -z "$(
dd bs=1 count=1 2>/dev/null; stty "$s")" || (exec sh)
do echo "$SECONDS:" do your stuff here maybe                             
   echo  no sleep necessary, I think                                                          
   [ "$((i+=1))" -gt 10 ] && exit                                                             
done       
) </dev/tty

while다음은 여러분이 시도해 볼 수 있도록 제가 만든 작은 예제 루프입니다 . 2초마다 dd읽기 시도 stdin(에서 리디렉션됨 /dev/tty)가 시간 초과되고 while루프가 반복됩니다. 그거 아니면dd 아니요키를 눌러 시간이 초과되었습니다. 이 경우 대화형 셸이 호출됩니다.

이것은 테스트 실행입니다. 각 줄의 시작 부분에 인쇄된 숫자는 쉘 변수의 값입니다 $SECONDS.

273315: do your stuff here maybe
no sleep necessary, I think
273317: do your stuff here maybe
no sleep necessary, I think
273319: do your stuff here maybe
no sleep necessary, I think
273321: do your stuff here maybe
no sleep necessary, I think
sh-4.3$ : if you press a key you get an interactive shell
sh-4.3$ : this example loop quits after ten iterations
sh-4.3$ : or if this shell exits with a non-zero exit status
sh-4.3$ : and speaking of which, to do so you just...
sh-4.3$ exit
exit
273385: do your stuff here maybe
no sleep necessary, I think
273387: do your stuff here maybe
no sleep necessary, I think
273389: do your stuff here maybe
no sleep necessary, I think
273391: do your stuff here maybe
no sleep necessary, I think
273393: do your stuff here maybe
no sleep necessary, I think
273395: do your stuff here maybe
no sleep necessary, I think
273397: do your stuff here maybe
no sleep necessary, I think

관련 정보