Bash 스크립트에서 테스트 실행 구현

Bash 스크립트에서 테스트 실행 구현

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

관련 정보