나는 수천 줄의 Bash 스크립트를 가지고 있는데, 각 줄에는 하나의 ffmpeg
명령이 포함되어 있습니다. 나는 이것을 시작했고 source script
훌륭하게 운영되고 있습니다.
그러나 이 스크립트를 다양한 방법으로 제어하려고 하면 상황이 완전히 잘못됩니다.
Ctrl + Z
전부 일시정지 하면현재의ffmpeg
일시 중지 명령 및다음여기 간다! 내가 원하는 건 아니야!- 모든 것을 중지 하면
Ctrl + C
스크립트가 다음ffmpeg
명령으로 이동하고 최종적으로 모든 것을 중지하려면 스크립트의 각 줄에 대해 한 번씩 눌러야 합니다. 순수한 지옥. ps -ef
다른 셸에서 일시 중지/종료하는 명령을 찾으려고 시도 했지만source
목록에 존재하지 않습니다.
그렇다면 내가 원하는 방식으로 상위 스크립트를 일시 중지/중지하려면 어떻게 해야 합니까? 또는 스크립트를 적절하게 제어할 수 있도록 스크립트를 다르게 실행하려면 어떻게 해야 합니까?
답변1
스크립트를 가져오는 대신 스크립트를 스크립트로 실행해 보세요.
$ bash <scriptname>
답변2
문제는 -sent- 신호를 ffmpeg
포착 하지만 신호가 해당 신호에도 사용되는지 알 수 없기 때문에 bash에서는 무시된다는 것입니다.SIGINT
Ctrl+C
이 문제를 해결하는 한 가지 방법은덫스크립트에서 신호를 가져와 로컬에서 처리합니다.
예를 들어, 파일 시작 부분에 트랩을 추가하려면 명령을 사용하십시오. 그런 다음 실행 가능하게 만들고 다음 중 하나를 수행하여 실행하십시오$ bash script_file
.아니요source
:
trap 'exit' INT
메시지와 메시지로 끝나는 좀 더 이국적인 회선종료 상태 130:
trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
그 다음에:
$ ./file_with_commands
또는 조달 킬러 스크립트:
#!/bin/bash
trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
source "$1"
그 다음에:
$ ./sourcetrap file_with_commands
간단한 예제 스크립트는 다음과 같습니다.
#!/bin/bash
if [[ $1 = trap ]]; then
trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
fi
ping localhost
ping localhost
ping localhost
- 트랩 없이 실행:
./script_name
- 트랩 포함:
./script_name trap
그런 다음 Ctrl+C차이점을 목격하십시오.
그럼 다시는하지 마세요.source
이러한 스크립트는 터미널 프롬프트에서 제공됩니다.