在管道命令中使用 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也会从中读取数据stdin,因此会阻塞,直到您的实际输入达到 EOF(此时没有更多数据可供第二个sort实例读取)。

因此,重定向您的第一个sortstdin我添加了参数支持(使用$@),如果您不想要,只需将其删除):

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

编辑:添加了参数支持(例如,您可以使用sort_by_version -r来反转结果等)

相关内容