将内置读取与管道和此处字符串一起使用



我正在处理一个图片包,"file"从中返回以下内容:

$ file pic.jpg
pic.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 96x96, segment length 16, baseline, precision 8, 231x288, frames 3
$ file pic.jpg | cut -d',' -f8 | tail -c+2
231x288

因此,在进行裁剪之前,我使用内置的"读取"在两个变量中选择维度。

但我有点想不通。为什么这个结构不起作用。。。

$ ( file pic.jpg | cut -d',' -f8 | tail -c+2 | IFS=x read width height ; echo w:$width h:$height; )
w: h:

在这个结构工作的时候?

$ ( IFS=x read width height <<< $(file pic.jpg | cut -d',' -f8 | tail -c+2) ; echo w:$width h:$height; )
w:231 h:288

总之,在这种情况下,为什么我不能使用内置"读取"的管道?

在bash中,管道中的命令在子shell中运行(请参阅手册中管道的最后一段)。当子shell退出时,您在子shell中声明的任何变量都将消失。

您可以使用{ }分组构造将readecho保持在相同的子shell中:

file pic.jpg | cut -d',' -f8 | tail -c+2 | { IFS=x read width height ; echo w:$width h:$height; }

这就是here字符串有用的原因:它在当前shell中运行read命令,因此变量在下一个命令中可用。

您可以使用ImageMagick中的identify并执行

$ identify -format 'w=%[w]; h=%[h]' file.jpg

注意=;的使用,这样您就可以进行

$ eval $(identify -format 'w=%[w]; h=%[h]' file.jpg)

设置shell 中的变量

实际上,当您使用bash时,有一种更简单的方法只需要一行,不需要eval s,也不需要cut s和tail s:

read w h < <(identify -format "%w %h" file.jpg)

当你想提取许多参数时,比如高度、宽度、平均值、标准差、色彩空间和独特颜色的数量等,它真的会发挥作用。所有这些都在一个调用中:

read w h m s c u < <(identify -format "%w %h %[mean] %[standard-deviation] %[colorspace] %k" file.jpg)

相关内容

  • 没有找到相关文章

最新更新