bash 스크립트가 있습니다
여러 번 반복하고 반복 사이에 아마도 오랜 시간 동안 휴면하는 for 루프가 있습니다. 그럼 그것
결과를 파일에 쓴 후 종료합니다.
때때로 많은 루프 반복이 완료되기 전에 원하는 결과를 얻습니다.
break
이 경우 for 루프를 종료하는 스크립트가 필요하며 이는 다음과 같습니다.
뭔가를 하거나
잠
이런 방식으로 지금까지 수집된 데이터의 보고서 파일을 작성하는 for 루프 이후 나머지 스크립트를 계속 실행합니다.
break
for 루프에서 벗어나기 위해 키 조합(예: 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