我正在处理一个图片包,"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中声明的任何变量都将消失。
您可以使用{ }
分组构造将read
和echo
保持在相同的子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)