`pv fileName | 的 bash 函数sha256sum -b`

`pv fileName | 的 bash 函数sha256sum -b`

我使用的是带有 GNU bash 的 Linux Mint 18.2,版本 4.3.48(1)-release (x86_64-pc-linux-gnu)。

我想sha256sum用我定义的函数重新定义.bash_aliases它以显示进度,因为我经常将它用于 100+GB 文件。

函数如下:

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:

删除\函数的符号,如下所示:

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
}

此 shell 函数的缺点是您无法将命令行标志传递到sha256sum、 或多个输入文件。

相关内容