나는 명령이 포함된 파일의 각 줄을 읽고 하나씩 실행하며 명령이 실패하면 중지하는 bash 스크립트를 작성했습니다.
while read -r line
do
$line || exit 1
done< /root/ansi-pb/sample.txt
Sample.txt에는 다음 명령이 있습니다.
echo "hello world"
free -m
mvn -version
date
echo "bye"
이 스크립트를 즉석에서 작성하여 실패한 명령이 발생하면 텍스트 파일에서 수정하고 스크립트를 다시 실행할 때 처음부터 시작하는 대신 실패한 명령부터 시작해야 합니다.
어떻게 해야 하나요?
답변1
#!/bin/bash
echo "$0 $$"
##Here do your stuff and redirect the errors to a log file
##if an error is found say using $?, use the following
kill -SIGSTOP $$
##After you'r done correcting your file
##use kill -SIGCONT <pid> on a console, the process shall continue
## Put in a mechanism to retry the last executed command
echo "I am done!!! after SIGSTOP $$"
exit 0
이는 단지 예시일 뿐이므로 요구 사항에 따라 원하는 방식으로 구현할 수 있습니다.
답변2
이것은 ERR
함정을 설정합니다.
trap 'printf "Error for %s, halted, continue with fg\n" "$cmd"; kill -s STOP $$; continue' ERR
while IFS= read -r cmd; do
command $cmd
done <input
이 트랩은 일반적으로 에서 스크립트가 실행되도록 하는 오류에 의해 트리거됩니다 set -e
. 트랩은 정보 메시지를 인쇄한 다음 프로세스를 일시적으로 중지합니다.
사용자가 다시 시작하면 fg
트랩 continue
의 명령문은 입력의 다음 줄을 읽도록 보장합니다.
스크립트가 일시 중지된 동안 입력 파일을 편집할 수 있습니다. 스크립트는 실패한 명령이 포함된 줄 뒤의 다음 입력 줄부터 계속 읽습니다.