作为shell脚本的初学者,我编写了这个bash脚本函数来返回文件的md5sum,同时为用户提供GUI进度条。
md5sum_of_file () {
(pv -n $1 | md5sum | sed -e 's/\s.*//g' > /tmp/md5sum) 2>&1 | zenity --progress --auto-close
echo $(</tmp/md5sum)
rm /tmp/md5sum
}
pv -n $1
将文件输入md5sum | sed -e 's/\s.*//g'
(sed去除和的相关文件名的输出),同时将一个百分比换成zenity --progress --auto-close
。
我知道你不能简单地将校验和分配给这个实例中的变量,因为“(pv -n $ 1 | $(md5sum | sed -e's / \ s。* // g'))”是在它自己的子shell中。但有没有办法在不创建临时文件的情况下执行此操作(在本例中为“/ tmp / md5sum”)?
感谢。
答案 0 :(得分:2)
zenity
使用的唯一内容是来自pv
的标准错误,因此使用进程替换来执行此操作而不涉及其他命令的任何stdout或stderr。这使得sed
的输出可以简单地转到标准输出而无需
任何临时文件。
pv -n "$1" 2> >(zenity --progress --auto-close) | md5sum | sed -e 's/\s.*//g'
答案 1 :(得分:1)
我想这会(用Bash):
md5sum_of_file() {
local md5sum
read -r md5sum _ < <( { { pv -n "$1" | md5sum >&3; } 2>&1 | zenity --progress --auto-close; } 3>&1)
echo "$md5sum"
}
我们在这里做了一些管道工作:
pv
的标准输出(即文件内容)通常传递给md5sum
,md5sum
的输出重定向到文件描述符3; pv
的标准错误流重定向到标准输出,以便输入zenity
; md5sum
的输出)重定向到标准输出,由read
读取; read
只读取其中的第一个字段(这样我们就不需要sed
来剪切文件名); echo
结果。如果你的功能只是这样做(也就是说,你只需要echo
md5总和),你也可以这样做:
md5sum_of_file() {
{ { pv -n "$1" | md5sum >&3; } 2>&1 | zenity --progress --auto-close; } 3>&1 | { read -r md5sum _; echo "$md5sum"; }
}