如何转义命令行进行日志记录?

问题描述 投票:0回答:1

我想回显脚本正在运行的命令以进行调试。

所以,我的脚本有一行运行命令:

negate() {
    echo \( "$1" -negate \)
}
NEGATED_IMAGE="$(negate 'my image.png')"
convert $=NEGATED_IMAGE two.png -composite out.png

我只需在回显后将其复制粘贴到上面即可查看运行的命令:

echo convert $=NEGATED_IMAGE two.png -composite out.png
convert $=NEGATED_IMAGE two.png -composite out.png

日志没有我想要的那么有用。以上日志

convert ( my image.png -negate ) two.png -composite out.png

无法将其复制粘贴到我自己的命令行中来运行相同的命令,因为括号未转义,

input image.png
参数中的空格也未转义或引用。

那么,我的脚本如何记录它将执行的命令行,以便将记录的行复制粘贴到我的 zsh 提示符中将运行相同的命令?

所以上面的案例应该记录类似的内容

convert \( 'my image.png' -negate \) two.png -composite out.png

因为这是脚本正在执行的实际命令。

shell command-line zsh
1个回答
0
投票

$(image_one 'input image.png')
的标准输出成为
convert
的第一个参数,因此convert将字符串
( input image.png -negate )
视为第一个参数。

将参数传递给程序时,首先编写参数列表以及它们应该位于哪个参数位置是有意义的。根据您的描述,我了解到

convert
应该获得以下参数:

  • 1 美元:
    (
  • 2 美元:
    input image.png
  • $3:`-否定
  • 4 美元:')'

因此,目标是创建一个包含 4 个元素的数组,然后可以将其插入到 convert 的调用中。您还想使用一个辅助函数,它只接收第二个参数并添加其他 3 个参数。

这是一种可能的方法:

image_one() {
  arrname=${1?Array name missing}
  par2=$2 
  eval $arrname'=( "(" $par2 -negate ")" )
}

image_one myarr 'image image.png'
convert "${myarr[@]}" two.png -composite out.png
© www.soinside.com 2019 - 2024. All rights reserved.