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

时间:2014-11-15 16:32:53

标签: bash pipe temporary-files zenity

作为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”)?

感谢。

2 个答案:

答案 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的标准输出(即文件内容)通常传递给md5summd5sum的输出重定向到文件描述符3;
  • 然后将pv的标准错误流重定向到标准输出,以便输入zenity;
  • 在此之后,我们将文件描述符3(请记住,它是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"; }
}