首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免在这个bash脚本中使用临时文件?

如何避免在这个bash脚本中使用临时文件?
EN

Stack Overflow用户
提问于 2014-11-15 16:32:52
回答 2查看 967关注 0票数 1

作为shell脚本的初学者,我编写了这个bash脚本函数来返回文件的md5sum,同时为用户提供了一个GUI进度条。

代码语言:javascript
复制
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")的情况下,是否有办法做到这一点?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-15 18:07:23

zenity使用的唯一东西是来自pv的标准错误,因此使用进程替换来完成此操作,而不涉及来自其他命令的任何stdout或stderr。这使得sed的输出可以简单地转到标准输出,而不需要任何临时文件。

代码语言:javascript
复制
pv -n "$1" 2> >(zenity --progress --auto-close) | md5sum | sed -e 's/\s.*//g'
票数 2
EN

Stack Overflow用户

发布于 2014-11-15 17:11:20

我想这个(和Bash一起)就行了:

代码语言:javascript
复制
md5sum_of_file() {
    local md5sum
    read -r md5sum _ < <( { { pv -n "$1" | md5sum >&3; } 2>&1 | zenity --progress --auto-close; } 3>&1)
    echo "$md5sum"
}

我们在这里做一些管道工程:

  • pv的标准输出(即文件的内容)通常被传递给md5summd5sum的输出被重定向到文件描述符3;
  • 然后将pv的标准错误流重定向到标准输出以输入到zenity
  • 在此之后,我们将文件描述符3(记住,它是md5sum的输出)重定向到标准输出,由read读取;
  • read只读取该字段的第一个字段(因此我们不需要sed来剪切文件名);
  • 最后,我们echo的结果。

如果您的函数只这样做(也就是说,您只想echo md5和),那么您也可以这样做:

代码语言:javascript
复制
md5sum_of_file() {
    { { pv -n "$1" | md5sum >&3; } 2>&1 | zenity --progress --auto-close; } 3>&1 | { read -r md5sum _; echo "$md5sum"; }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26948038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档