파이프 명령에서 bash 기능 사용

파이프 명령에서 bash 기능 사용

다음과 유사한 명령이 있습니다 ... | sort -u -V. 일부 버전에서는 sort해당 플래그를 지원하지 않기 때문에 -V조건에 따라 플래그를 추가하는 함수를 만들어주면 좋겠다고 생각했습니다. 그러나 내 구현은 파이프된 명령에서는 작동하지 않는 것 같습니다. 내가 시도한 것은 다음과 같습니다.

function sort_by_version {
    if $(sort -u -V &>/dev/null); then
        sort -u -V
    else
        sort -u
    fi
}

그리고

git log -n 10 --format="%s" | sort_by_version

이 작업을 어떻게 수행할 수 있습니까? 아니면 다른 더 좋은 방법이 있습니까?

답변1

이 작업을 두 번 수행합니다 sort(한 번은 인수가 지원되는지 확인한 다음 실제로 실행합니다). 그러나 당신이 잊어버린 것은 첫 번째 인스턴스 sort도 그것으로부터 읽고 있으므로 실제 입력이 EOF에 도달할 때까지 차단된다는 것입니다(이 시점에서 두 번째 인스턴스가 읽을 stdin데이터가 더 이상 없습니다 ).sort

따라서 첫 번째 항목을 리디렉션하세요 sort( stdin매개변수 지원을 추가했습니다(사용 $@). 원하지 않으면 제거하세요).

function sort_by_version {
    if $(sort -u -V < /dev/null &>/dev/null); then
        sort -u -V "$@"
    else
        sort -u "$@"
    fi
}

편집하다:sort_by_version -r매개변수 지원이 추가되었습니다(예: 결과를 반전하는 데 사용할 수 있음 등).

관련 정보