파이프라인 체인에서 일반 명령처럼 bash 기능을 어떻게 사용할 수 있나요?

파이프라인 체인에서 일반 명령처럼 bash 기능을 어떻게 사용할 수 있나요?

Bash 스크립트의 대용량 파일에 대해 여러 명령을 실행하고 있습니다. 진행 상황을 모니터링하기 위해 pv 명령을 사용합니다.

예제 명령은 다음과 같습니다.

cat $IN_FILE | pv -w 20 -s $(du -sb $IN_FILE | awk '{print $1}') | grep ...

스크립트에는 유사한 구조를 가진 여러 명령이 포함되어 있으며 모든 명령에 동일한 접두사를 계속해서 사용하는 대신 진행률 모니터링 부분에 대한 약칭으로 함수를 정의했습니다. (참고: fSize 및 fSize Sum 함수는 위 예제에서 du 명령 부분을 래핑합니다. 여기서 fSizeSum은 두 파일 크기의 합을 반환하고 fSize는 한 파일 크기를 반환합니다.):

function prog()
{
    local __size
    if [[ $2 ]]
    then
        __size=$(fSizeSum $1 $2)
    else
        __size=$(fSize $1)
    fi

    echo "cat $1 | pv -w 20 -s ${__size}"
}

이 접근 방식은 실제로 명령을 약간 단축합니다. 이제 위의 예제를 다음과 같이 실행할 수 있습니다.

eval "$(prog $IN_FILE) | grep ..."

여전히 나를 괴롭히는 것은 이제 각 행을 인용하고 eval을 사용해야 한다는 것입니다. 나는 오히려 "prog" 함수를 일반 쉘 명령인 것처럼 사용하고 싶습니다. 즉:

prog $IN_FILE | grep ...

지금까지 파이프라인 명령 체인에서 접두사 역할을 하도록 함수를 수정하려는 모든 시도는 실패했습니다.

사용자 정의 bash 스크립트 기능을 일반 bash 명령처럼 실행하고 파이프라인 체인 앞에 배치할 수 있는 방법이 있습니까? 함수를 사용하여 이를 달성할 수 없는 경우 스크립트에서 로컬 별칭을 정의하는 등 이를 달성할 수 있는 다른 방법이 있습니까?

답변1

귀하의 함수 정의에서 다음을 바꾸는 것이 좋습니다.

echo "cat $1 | pv -w 20 -s ${__size}"

오직:

cat $1 | pv -w 20 -s ${__size}

eval이렇게 하면 함수 자체가 호출자에서 호출하지 않고도 이 코드를 실행할 수 있습니다.

답변2

pv파일을 인수로 전달한 것처럼 작동 cat하므로 -s를 전달할 필요도 없습니다.

그래서 당신은 이것을 할 수 있습니다 :

pv -w 20 $IN_FILE | grep ...

관련 정보