Use uma função bash em um comando em pipeline

1

Eu tenho um comando semelhante a: ... | sort -u -V . Como algumas versões de sort não suportam o sinal -V , achei que seria ótimo se eu fizesse uma função que condicionalmente adiciona a sinalização. Mas, parece que minha implementação não funciona em um comando em pipeline. Aqui está o que eu tentei:

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

e

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

Como posso fazer este trabalho ou o que é melhor abordado?

    
por linkyndy 22.05.2014 / 13:49

1 resposta

3

Você está executando sort duas vezes (uma vez para verificar se o parâmetro é suportado e, em seguida, para executá-lo). Mas o que você esqueceu é que seu primeiro sort também lê stdin e, portanto, bloqueia até que sua entrada real atinja EOF (no ponto em que não há mais dados para ler para sua segunda sort instance). / p>

Portanto, redirecione seu primeiro sort stdin (adicionei suporte a parâmetro (usando $@ ), se você não quiser, basta removê-lo):

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

Editar: suporte ao parâmetro adicionado (por exemplo, você pode usar sort_by_version -r para reverter os resultados, etc.)

    
por 22.05.2014 / 14:04