쉘 스크립트 실행 시 현재 단락을 건너뛰는 터미널 키 입력/조합

쉘 스크립트 실행 시 현재 단락을 건너뛰는 터미널 키 입력/조합

나는 데비안과 리눅스에서 bash 스크립트를 자주 실행합니다.

우리 모두는 CTRL + C 키 조합이 현재 프로그램을 중단하고 실행 파일/스크립트를 닫을 수 있다는 것을 알고 있지만, 이 키 입력은 배치/스크립트를 완전히 종료합니다.

내가 찾고 있는 것은 키 입력입니다매우 실용적인 단락에 대해서만 건너뛰기(중첩된 CTRL+C 등)단락을 실행하지 않더라도 for 루프의 "break" 및 "continue"와 마찬가지로 오류 조건이 발생합니다.

예시 스크립트:

데모 파일

wget http://something_from_the_internet...
unzip that_file
ping my_host
4th passage...
5th passage...

키 조합을 눌러 두 번째 명령(이 경우 압축 풀기)으로 이동하거나, 두 번 누르고 세 번째 명령(이 경우 ping...)으로 바로 이동하고 싶습니다.

많은 경우 스크립트 파일의 결과는 모든 단락에 의해 제공됩니다. 그러나 제 경우에는 그렇지 않습니다. 테스트 목적으로 이러한 조합을 사용하면 상단의 모든 줄에 주석을 달지 않고도 콘텐츠를 실행하고 테스트할 수 있습니다. 하단에서 최신 정보를 간단히 살펴보세요.

답변1

Bash를 사용하면 실행 중인 프로세스를 "건너뛸" 수 없습니다. ~에 따르면이것Bash 문서 페이지에서 신호에 대한 건너뛰기 동작이 있더라도 건너뛰기를 실행하기 전에 프로세스 실행이 완료될 때까지 기다리므로 다음 지침만 효과적으로 건너뜁니다. 그러나 백그라운드에서 실행되는 동안(예를 들어 SIGINT가 수신될 때) 압축 풀기 프로세스가 자동으로 종료되도록 스크립트 실행 방식을 변경할 수 있습니다(가이드).

답변2

SIGINTBash의 내장 기능을 사용하여 선택적으로 신호를 포착할 수 있습니다 trap.

trap [COMMANDS] [SIGNALS]

예를 들어, SIGINT포그라운드 스크립트로 전송된 신호를 캡처하여 스크립트에서 생성된 프로세스로 신호를 보낼 수 있습니다.

그러나 이 경우 포크된 프로세스의 PID가 필요합니다. Bash의 변수를 사용할 수 있지만 $!이는 백그라운드로 분기된 프로세스에서만 작동합니다.

해결 방법으로 스크립트의 동기 특성을 유지하려면 wait반환된 PID를 명시적으로 호출할 수 있습니다.

#!/usr/bin/env bash

function skip() {
  kill -SIGTERM $!
}

trap skip SIGINT

ping ... &
wait $!

wget ... &
wait $!

unzip ... &
wait $!

관련 정보