パイプコマンドで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

これを2回実行しますsort(一度は引数がサポートされていることを確認してから実際に実行します)。しかし、あなたが忘れてしまったのは、sort最初のインスタンスもそれから読み取っているので、実際の入力がEOFに達するまでブロックされることです(この時点で2番目のインスタンスが読み取るstdinデータはもうありません)。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パラメータサポートが追加されました(結果を反転するために使用できるなど)。

関連情報