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 ...