使用内置读取管道和此处的字符串

时间:2015-03-30 15:40:22

标签: bash pipeline herestring

我正在处理一个图片包,“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

所以我在继续裁剪之前使用内置的“read”在两个变量中选择维度。

但有些事情让我望而却步。为什么这个结构不起作用......

$ ( 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

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

3 个答案:

答案 0 :(得分:3)

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

您可以使用{ }分组构造将readecho保留在同一个子shell中:

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

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

答案 1 :(得分:1)

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

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

注意=;的使用,以便您可以

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

在shell中设置变量

答案 2 :(得分:0)

实际上,当您使用bash时,有一个更简单的方法,只需要一行,没有eval,没有cut和没有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)