自动回显for循环的内容

自动回显for循环的内容

我经常使用 for 循环来转换一堆文件格式。在某些情况下,当发生文本转换或变量时,最好检查替换是否正确执行。

for i in *; do convert $i ${i%jpg}png; done

有没有一种简单的方法来显示执行的命令?按照上面的例子,大致如下:

convert image1.jpg image1.png
  # command output
convert image2.jpg image2.png
  # command output
  # ...

答案1

set -x
for file in *jpg; do
    convert "${file}" "${file%jpg}png"
done
set +x

设置-xshell 选项将显示每个已执行的命令,因为它被设置为在所有参数扩展完成后执行。 +x撤消此操作。

答案2

对于这种事情,我也使用该xtrace选项(用set -x// set -o xtrace/ setopt xtrace...设置options[xtrace]=on),但在子 shell 中:

(set -x; for f (*.jpg) convert -- $f $f:r.png)

(这也使得工作控制更加清晰,并且顺便避免了该变量污染环境$f)。

要在本地设置选项而不创建子 shell,您还可以使用匿名函数和localoptions选项。

(){ set -o localoptions -x; for f (*.jpg) convert -- $f $f:r.png; }

(并添加 alocal f 使其$f成为该匿名函数的本地函数)。

for f (*.jpg) (set -x; convert -- $f $f:r.png)

会让它变得不那么冗长(并节省一个进程)。

然而,在 ImageMagick 图像转换的情况下,您可以这样做:

$ mogrify -verbose -format png -- *.jpg
a.jpg JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 2.07201MiB 0.050u 0:00.053
a.jpg=>a.png JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 7.69297MiB 2.680u 0:02.640
b.jpg JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 2.07201MiB 0.060u 0:00.050
b.jpg=>b.png JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 7.69297MiB 2.650u 0:02.617

相关内容