스크립트가 다음과 같습니다.
c=0
for f in */*; do
cp -v "$f" "/myhome/CE$(printf '%0*d' 2 $BATCHNUM)-new-stuctures_extracted/test-$(printf '%0*d' 5 $c)"
c=$((c=c+1))
done
그러나 사용자는 변수 호출 BATCHNUM을 제공해야하며 그렇지 않으면이 스크립트를 강제로 중지해야합니다. 이 스크립트를 호출하는 스크립트 (또는이 스크립트를 호출하는 # 2 스크립트를 호출하는 # 1 스크립트)도 강제로 중지 할 수 있다면 더 좋습니다.
답변
가장 빠른 방법은 스크립트 시작 부분에 다음 두 줄을 추가하는 것입니다.
set -u # or set -o nounset
: "$BATCHNUM"
첫 번째 줄 nounset
은 스크립트를 실행하는 셸 에서 옵션을 설정하며 , 설정되지 않은 변수를 확장하려고하면 중단됩니다. 두 번째 $BATCHNUM
는 no-op의 맥락에서 확장 되어 다른 작업을 수행하기 전에 중단을 트리거합니다.
더 유용한 오류 메시지를 원한다면 대신 다음과 같이 쓸 수 있습니다.
if [[ -z "$BATCHNUM" ]]; then
echo "Must provide BATCHNUM in environment" 1>&2
exit 1
fi
또는 비슷합니다.
답변
여기서 확인하려는 BATCHNUM
null이 아닌 설정되어 있습니다.
POSIX 쉘은 이 작업에 대한 매개 변수 확장 을 제공합니다 . 다음을 사용하기 전에이 줄을 추가하십시오 BATCHNUM
.
: "${BATCHNUM:?Variable not set or empty}"
또는 BATCHNUM
사용자가 값을 제공하지 않은 경우 기본값을 설정하는 것이 좋습니다 .
: "${BATCHNUM:=3}"
답변
[ -n "$BATCHNUM" ] || { kill "$PPID"; exit 1; }
#Unless $BATCHNUM is defined and unempty, ask parent process to exit and exit w/ 1
이것은 bash와 POSIX sh에서 작동합니다. 나는 빈 변수와 정의되지 않은 변수를 구별하지 않는 것을 선호합니다 (즉, 마음에 들지 않지만 set -u
그저 나뿐입니다).
답변
선
if [ -z "$BATCHNUM" ]; then
exit 2;
fi
비어 있는지 확인하십시오 $BATCHNUM
. $PPID
부모 와 함께 해를 끼칠 수 있습니다 ( kill $PPID
). 조부모를 살해하려면의 데이터를 보는 것과 같은 다른 방법으로 프로세스 ID를 가져와야합니다 /proc/$PPID
.
그러나 부모가 사망하면 신호 ( SIGHUP
)를 보내 므로 누군가를 죽이기 전에 덫을 놓아야합니다.
trap '' SIGHUP
업데이트 : 부모를 죽여야한다고 생각하면 잘못하고 있습니다. 의미있는 종료 코드를 반환하십시오. 부모 스크립트는 호출 된 스크립트의 리턴 코드를 확인하고 이에 따라 반응해야합니다.
답변
BATCHNUM
가 정의되어 있는지 테스트하고 정의되어 있지 않으면 종료하십시오.
if [ -n "${BATCHNUM-a}" ]; then
echo >&2 "Fatal error: BATCHNUM not set"
exit 2
fi
BATCHNUM
비어 있는 경우도 거부 하려면${BATCHNUM:+a}
대신을${BATCHNUM+a}
. ${VARIABLE+TEXT_IF_NULL}
매개 변수 확장 구문 에 대한 정보 는 bash 매뉴얼을 참조하십시오 .
부모 프로세스를 죽이지 마십시오. 부모 프로세스가 무엇인지 모릅니다. 이 스크립트를 호출하는 일부 스크립트가이 스크립트가 중단되면 중단해야하는 경우이 스크립트의 종료 상태를 확인하십시오. 예를 들어 스크립트 # 2 :
script3 || exit $?
set -e
명령이 실패 (0이 아님) 상태를 반환하는 경우 스크립트를 중단하는 데 사용 합니다.