Bash 스크립트에서 테스트 실행 옵션을 어떻게 구현합니까?
스크립트가 테스트 실행으로 실행 중인 경우 명령을 실행하는 대신 if로 모든 단일 명령을 래핑하고 명령을 에코아웃하는 방법을 생각할 수 있습니다.
또 다른 방법은 함수를 정의한 다음 해당 함수를 통해 각 명령 호출을 전달하는 것입니다.
다음과 같은 것 :
function _run () {
if [[ "$DRY_RUN" ]]; then
echo $@
else
$@
fi
}
`_run mv /tmp/file /tmp/file2`
`DRY_RUN=true _run mv /tmp/file /tmp/file2`
이것이 잘못된 것일까요? 훨씬 더 나은 방법이 있을까요?
답변1
보다BashFAQ/050: 변수에 명령을 넣으려고 하는데 복잡한 경우가 항상 실패합니다!이 주제에 대한 토론을 위해.
지금은 제거되었지만 해당 섹션은프로그램에 테스트 기능을 추가하는 방법여전히 유용할 수 있습니다.
답변2
@Dennis Williamson의 답변을 가지고 놀고 싶었습니다. 내가 얻은 것은 다음과 같습니다.
Run () {
if [ "$TEST" ]; then
echo "$*"
return 0
fi
eval "$@"
}
여기서는 가 eval "$@"
중요하며 단순히 를 수행하는 것보다 낫습니다 $*
. $@
모든 매개변수를 반환하고 $*
공백/따옴표 없이 모든 매개변수를 반환합니다.
$ mkdir dir
$ touch dir/file1 dir/file2
$ FOO="dir/*"
$ TEST=true Run ls -l $FOO
ls -l dir/file1 dir/file2
$ Run ls -l $FOO
-rw-r--r-- 1 stefanl stefanl 0 Jun 2 21:06 dir/file1
-rw-r--r-- 1 stefanl stefanl 0 Jun 2 21:06 dir/file2