명령 실행 또는 인쇄 리디렉션 문제를 허용하기 위해 함수에서 명령 실행을 래핑하는 방법

명령 실행 또는 인쇄 리디렉션 문제를 허용하기 위해 함수에서 명령 실행을 래핑하는 방법

나는 많은 외부 명령을 실행하는 BASH 코드를 작성했습니다(부작용 발생). 따라서 개발 및 디버깅 목적으로 명령을 실행하거나 인쇄할 수 있도록 실행을 셸 함수로 래핑하고 싶습니다.

따라서 기본 코드는 다음과 같습니다.

run()
{
    if [ "$print_commands" -ne 0 ]; then
        echo "$@"
    else
        "$@"
    fi
}

> /dev/null안타깝게도 대부분의 외부 명령은 성공 시 "성공"과 같은 내용을 출력하므로 저는 이러한 출력의 리디렉션을 사용해 왔습니다 . 그러나 일부 상태 쿼리가 있습니다.하다출력 상태이며 폐기할 수 없습니다.

그러니 분명히 나는할 수 없다> /dev/null내부에 추가했습니다 run. 또한 두 번째 리디렉션 기능을 추가하여 대부분의 코드를 복제하고 싶지 않습니다.

나는 이 솔루션을 시도했습니다.

silence='>/dev/null'
run some_command with params $silence

silence아이디어는 명령을 인쇄할 때 빈 문자열로 설정하는 것인데, 이는 작동하지만 명령을 실행할 때 다음과 같은 결과를 얻습니다.

오류: 인식할 수 없는 인수: >/dev/null

사용되지 않는 중간 정도의 우아한 솔루션이 있습니까 eval?

답변1

함수의 다른 변수를 확인 run하고 이를 사용하여 리디렉션을 결정하는 것은 어떨까요?

run()
{
    if [ "$print_commands" -ne 0 ]; then
        echo "$@"
    elif [ "$silence" -ne 0 ]; then
        "$@" > /dev/null
    else
        "$@"
    fi
}

그 다음에:

silence=1 run some_command with params whose output is not needed
silence=0 run some_command with params whose output is needed

또는 stdout 대신 stderr로 명령을 출력할 수 있습니다.

run()
{
    if [ "$print_commands" -ne 0 ]; then
        echo "$@" >&2
    else
        "$@"
    fi
}

답변2

기반으로https://unix.stackexchange.com/a/726123/320598run리디렉션을 제어하기 위해 추가 첫 번째 매개변수를 추가하기로 결정했습니다 /dev/null.

run()
{
    declare silence="$1"; shift
    if [ "$print_commands" -ne 0 ]; then
        echo "$@"
    elif [ "$silence" -ne 0 ]; then
        "$@" > /dev/null
    else
        "$@"
    fi
}

run 0 non_redirected_command params
run 1 redirected_command params

관련 정보