在 exec 命令中处理单引号和 $

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

我正在尝试执行这行代码,这里添加的“Audio”后没有换行符,只是为了不显示水平滚动条:

[exec mediainfo --Output=$'General;File Name: %FileName%\nAudio;
 Duration: %Duration/String3%' 01_gen/01001.mp3]

它在 Linux 的命令行上运行,没有

exec
;但它不会在 Tcl 中运行。错误是:

Usage: "mediainfo [-Options...] FileName1 [Filename2...]"
"mediainfo --Help" for displaying more information

我读到单引号“对 Tcl 没有特殊意义”(在 https://www.tcl.tk/man/tcl8.6/TclCmd/exec.html),那里的例子似乎用 { }.我尝试转义 $,但它会产生相同的错误。

[exec mediainfo --Output=\${General;File Name: %FileName%\nAudio;
 Duration: %Duration/String3%} 01_gen/01001.mp3]

我也试过转义分号,它没有出错,但它返回所有值,而不仅仅是语句中请求的值。

[exec mediainfo --Output=\${General\;File Name: %FileName%\nAudio\;
 Duration: %Duration/String3%} 01_gen/01001.mp3]

我还尝试了这个 SO question 中指出的扩展方法的几种变体,但我能得到的最好的是返回所有媒体属性,而不是请求的两个属性。

set cmd {mediainfo --Output=$'General;File Name: %FileName%\nAudio;
 Duration: %Duration/String3%' 01_gen/01001.mp3}
chan puts stdout [exec {*}$cmd]

你能解释一下我做错了什么,需要做什么才能让它在 Tcl 中执行吗?

谢谢。

编辑:

既然 Shawn 已经解释了这个问题,我意识到,如果我更仔细地阅读了SO question about mediainfo 的第一个答案(并且对 bash 并不一无所知)我可以明确地添加新行,使该答案指的是什么以作为模板;然后只使用正常的 Tcl 替换。有时我可以很密集。

set param {--Output=General;File Name: %FileName%
Audio; Duration: %Duration/String3%}
chan puts stdout [exec mediainfo $param 01_gen/01001.mp3]
# File Name: 01001 Duration: 00:07:31.422

tcl
1个回答
1
投票

你需要:

exec mediainfo "--Output=General;File Name: %FileName%\nAudio; Duration: %Duration/String3%" 01_gen/01001.mp3

在像 bash(和其他一些,但不是 POSIX sh)这样的 shell 中,

$'...'
是一种类型的引号,用于将
\n
转换为实际的换行符并将所有空格分隔的部分分组为单一论点;美元符号和单引号实际上并没有传递给该参数中的程序。 tcl 中的双引号具有类似的效果,但应该围绕整个参数,而不仅仅是它的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.