作为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 000-$(md5sum_ sed -e‘s/\s.*/g’)“在它自己的子subshell中。但是,在不创建临时文件(在本例中为"/tmp/md5sum")的情况下,是否有办法做到这一点?
谢谢。
发布于 2014-11-15 18:07:23
zenity使用的唯一东西是来自pv的标准错误,因此使用进程替换来完成此操作,而不涉及来自其他命令的任何stdout或stderr。这使得sed的输出可以简单地转到标准输出,而不需要任何临时文件。
pv -n "$1" 2> >(zenity --progress --auto-close) | md5sum | sed -e 's/\s.*//g'发布于 2014-11-15 17:11:20
我想这个(和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"; }
}https://stackoverflow.com/questions/26948038
复制相似问题