我使用的是带有 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
、 或多个输入文件。