在 Bash for 循环中,我可以将前一个迭代的标准输出读取为标准输入吗?

1 bash loops pipe imagemagick

我有一个 bash oneliner,我通过相同的 ImageMagick 操作多次对一张图像进行管道传输。我想将其作为 Bash 循环来执行,最好不使用临时文件。

单行是:cat in.jpg | convert -quality 1 - jpg:- | convert -quality 1 - jpg:- | convert -quality 1 - jpg:- > out.jpg

这个也有效:(convert -quality 1 - jpg:- | convert -quality 1 - jpg:- | convert -quality 1 - jpg:-) > out.jpg < in.jpg

convert在命令中,-意思是“从标准输入读取”,jpg:-意思是“以 JPEG 格式输出到标准输出”。

我尝试过执行cat in.jpg | for x in {1..3}; do convert -quality 1 - jpg:-; done > out.jpg(for x in {1..3}; do convert -quality 1 - jpg:-; done) < in.jpg > out.jpg,但两者都给出相同的错误。

我希望获得应用了所有 3 个操作的输出文件,但相反,我得到的输出文件仅应用了一个操作以及以下错误,我认为这意味着第一次迭代会读取 in.jpg文件,但以下迭代不会在标准输入上获取任何内容:

convert: no decode delegate for this image format `' @ > error/constitute.c/ReadImage/501.
convert: no images defined `jpg:-' @ error/convert.c/ConvertImageCommand/3210.
convert: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
convert: no images defined `jpg:-' @ error/convert.c/ConvertImageCommand/3210.
Run Code Online (Sandbox Code Playgroud)

(我确认这只是第一次迭代通过运行来触及输出文件(for x in 90 30 1; do convert -quality $x - jpg:-; done) < in.jpg > out.jpg

che*_*ner 5

您可以定义一个递归函数:

rec_convert () {
  n=$1
  if [ $n -eq 0 ]; then
    cat
  else
    convert -quality 1 - jpg:- | rec_convert $((n - 1))
  fi
}

rec_convert 3 < in.jpg > out.jpg  
Run Code Online (Sandbox Code Playgroud)