`pvファイル名bash関数sha256sum -b`

`pvファイル名bash関数sha256sum -b`

私はGNU bashバージョン4.3.48(1)-リリース(x86_64-pc-linux-gnu)でLinux Mint 18.2を使用しています。

100GB以上のファイルによく使用されるため、進行状況を表示するために定義した関数でsha256sum上書きしたいと思います。.bash_aliases

機能は次のとおりです。

function sha256sum {

    if [ -z "$1" ]
    then
    {
        \sha256sum --help
    }
    else
    {
        pv $1 | \sha256sum -b
    }
    fi

}

しかし、説明できない犯人が何人かいます。

まず、予期せず動作してパラメータを「食べる」ことを強制しました。

具体的には、次のファイルは次のようになります。

-rw-r--r-- 1 root root 2.0K Jul 24 12:29 testdisk.log

これで終了しないファイルサイズを出力します。

vlastimil@vb-nb-mint ~ $ sha256sum testdisk.log 
1.92KiB 0:00:00 [40.8MiB/s] [====================================================>] 100%            
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
...
...
...
^C
[1]+  Stopped                 pv $1 | \sha256sum -b

私は何が間違っていましたか?中かっこの有無、セミコロンの有無などさまざまな構造を試しましたが、1時間以上これ以上の結果が得られませんでした。

編集1:

\次のように関数記号を削除します。

function sha256sum {

    if [ -z "$1" ]
    then
    {
        sha256sum --help
    }
    else
    {
        pv "$1" | sha256sum -b
    }
    fi

}

結果:

1.92KiB 0:00:00 [56.8MiB/s] [====================================================>] 100%            
1.92KiB
1.92KiB
1.92KiB
1.92KiB
...
...
...
^C
[2]+  Stopped                 pv "$1" | sha256sum -b

答え1

\sha256sum関数本体の各項目は、関数への再帰呼び出しです。名前の前にバックスラッシュを付けるとエイリアスとして解釈されませんが、関数として解釈されることは防げません。

たとえば、元の関数のレイアウトを維持しながら、次のようにcommand sha256sum作成したいと思います。\sha256sum

function sha256sum {

    if [ -z "$1" ]
    then
    {
        command sha256sum --help
    }
    else
    {
        pv "$1" | command sha256sum -b
    }
    fi

}

答え2

〜のようにダグが指摘した、関数を再帰的に呼び出しています。

彼はバックスラッシュを削除し、command代わりにバックスラッシュを使用するように正しくアドバイスしました。

また、中括弧は必須ではありませんが、許可されます。

私の機能は次のとおりです。

sha256sum () {
    if [ -n "$1" ]; then
        pv "$1" | command sha256sum -
    else
        command sha256sum --help
    fi
}

このシェル機能の欠点は、コマンドラインフラグを複数のsha256sum入力ファイルに渡すことができないことです。

関連情報