특정 키를 사용하여 긴 수면 및 기타 항목을 포함하는 BASH For 루프를 종료합니다.

특정 키를 사용하여 긴 수면 및 기타 항목을 포함하는 BASH For 루프를 종료합니다.

bash 스크립트가 있습니다

  • 여러 번 반복하고 반복 사이에 아마도 오랜 시간 동안 휴면하는 for 루프가 있습니다. 그럼 그것

  • 결과를 파일에 쓴 후 종료합니다.

때때로 많은 루프 반복이 완료되기 전에 원하는 결과를 얻습니다.

break이 경우 for 루프를 종료하는 스크립트가 필요하며 이는 다음과 같습니다.

  • 뭔가를 하거나

이런 방식으로 지금까지 수집된 데이터의 보고서 파일을 작성하는 for 루프 이후 나머지 스크립트를 계속 실행합니다.

breakfor 루프에서 벗어나기 위해 키 조합(예: CTRL+Q)을 사용하고 싶습니다 .

스크립트는 다음과 같습니다.

#!/bin/bash

for (( c=0; c<=$1; c++ ))
do  

# SOME STUFF HERE
#  data gathering into arrays and other commands here etc

# sleep potentially for a long time
sleep $2

done

#WRITE REPORT OUT TO SCREEN AND FILE HERE

답변1

이런 종류의 작업을 수행한 지 꽤 시간이 지났지만 예전에는 다음과 같은 작업이 수행되었던 것으로 기억됩니다.

#!/bin/bash

trap break INT

for (( c=0; c<=$1; c++ ))
do  

# SOME STUFF HERE
#  data gathering into arrays and other commands here etc

    echo loop "$c" before sleep

    # sleep potentially for a long time
    sleep "$2"

    echo loop "$c" after sleep

done

#WRITE REPORT OUT TO SCREEN AND FILE HERE

echo outside

아이디어는 순환을 깨기 위해 Ctrl사용 하는 것입니다. C신호(SIGINT)가 트랩에 의해 포착되어 루프를 중단하고 나머지 스크립트가 계속 실행될 수 있도록 합니다.

예:

$ ./s 3 1
loop 0 before sleep
loop 0 after sleep
loop 1 before sleep
^Coutside

이에 대해 궁금한 점이 있으면 알려주시기 바랍니다.

답변2

가장 쉬운 방법은 Ctrl+C기본적으로 신호를 내보내므로 INT대부분의 애플리케이션이 중지되고 셸에서 이를 포착할 수 있기 때문에 사용하는 것입니다.

전체 루프를 한 번에 중단하려면 서브셸에서 실행하고 exit중단 시 실행할 수 있습니다. 여기서 트랩은 서브쉘에만 설정되어 있고 종료됩니다.

#!/bin/bash

(
trap "echo interrupted.; exit 0" INT
while true; do
        echo "running some task..."
        some heavy task 
        echo "running sleep..."
        sleep 5;
        echo "iteration end."
done
)

echo "script end."

답변3

어떤 경우에는 "SOME STUFF HERE"를 중단하지 않고 쉘스크립트가 기다리는 동안에만 중단되는 솔루션을 갖는 것이 더 나을 수도 있습니다.

read그런 다음 일부 옵션과 함께 쉘 내장 기능을 대신 사용할 수 있습니다 sleep.

이 쉘 스크립트를 사용해보십시오.

#!/bin/bash

echo "Press 'q' to quit the loop and write the report"
echo "Press 'Enter' to hurry up (skip waiting this time)"

for (( c=0; c<=$1; c++ ))
do  

 echo "SOME STUFF HERE (pretending to work for 5 seconds) ..."
 sleep 5
 echo "Done some stuff"

#  data gathering into arrays and other commands here etc

# sleep potentially for a long time

#sleep $2
 read -n1 -st$2 ans
 if [ "$ans" == "q" ]
 then
  break
 elif [ "$ans" != "" ]
 then
  read -n1 -st$2 ans
 fi
done

echo "WRITE REPORT OUT TO SCREEN AND FILE HERE"

read다음 명령을 사용하여 이에 대한 세부 정보를 찾을 수 있습니다 help read.

      -n nchars return after reading NCHARS characters rather than waiting
            for a newline, but honor a delimiter if fewer than
            NCHARS characters are read before the delimiter
      -s    do not echo input coming from a terminal
      -t timeout    time out and return failure if a complete line of
            input is not read within TIMEOUT seconds.  The value of the
            TMOUT variable is the default timeout.  TIMEOUT may be a
            fractional number.  If TIMEOUT is 0, read returns
            immediately, without trying to read any data, returning
            success only if input is available on the specified
            file descriptor.  The exit status is greater than 128
            if the timeout is exceeded

관련 정보