`pv 文件名 | bash 函数 sha256sum -b`

Lin*_*eak 4 bash alias

我在 Linux Mint 18.2 上使用 GNU bash,版本 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

}
Run Code Online (Sandbox Code Playgroud)

但是有一些罪魁祸首,我无法解释。

对于它的行为出乎意料,我以某种方式设法迫使它“吃掉”参数。

具体来说,以下文件:

-rw-r--r-- 1 root root 2.0K Jul 24 12:29 testdisk.log
Run Code Online (Sandbox Code Playgroud)

现在它输出文件的大小,永无止境:

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
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我尝试了不同的结构,带和不带大括号,带和不带分号,一小时没有比这个更好的结果。

编辑1:

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

function sha256sum {

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

}
Run Code Online (Sandbox Code Playgroud)

结果是:

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

dha*_*hag 6

\sha256sum函数体中的每次出现都是对该函数的递归调用。使用反斜杠作为名称前缀可防止将其解释为别名,但不会防止将其解释为函数。

你想写command sha256sum而不是\sha256sum; 例如,保持原始函数的布局:

function sha256sum {

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

}
Run Code Online (Sandbox Code Playgroud)

  • 此外,不需要花括号。 (2认同)