我想在tcl中执行以下行:
exec awk -F"[][]" '/dB/ { print $2 }' <(amixer sget Master)
但是错误:missing close-brace出现了。
然后我把它换成这个:
exec awk -F"[][]" {/dB/ { print $2 }} <(amixer sget Master)
更改带有花括号的单引号。现在的错误是:
无法读取文件"(amixer": no such file or directory
然后我改变了这个:
exec awk -F{[][]} {/dB/ { print $2 }} <(amixer sget Master)
仍然是与后者相同的错误。
我真的很纠结于exec命令的tcl解析机制。请帮帮忙。谢谢。
amixer sget主输出:
Capabilities: pvolume pvolume-joined pswitch pswitch-joined
Playback channels: Mono
Limits: Playback 0 - 64
Mono: Playback 39 [61%] [-25.00dB] [on]发布于 2013-09-06 12:31:03
shell和Tcl有非常不同的语法,这是一个重要的领域。shell调用的正确音译:
awk -F"[][]" '/dB/ { print $2 }' <(amixer sget Master)这是:
exec amixer sget Master | awk {-F[][]} {/dB/ { print $2 }}在分词中,Tcl和shell对于如何引用事物和需要引用的内容有不同的想法。而且,让awk只从stdin获取它的输入要容易得多,而不是试图让Tcl句柄管道正确地按照shell所做的方式进行重定向(您可以这样做,但这是一项艰苦的工作,不值得为这么简单的事情操心)。
当然,您可以使用Tcl进行解析,因为它具有合理的正则表达式匹配支持。例如,它将分贝级别存储在变量decibels中。
set mixer "Master"
regexp {\[([\d.]+)dB\]} [exec amixer sget $mixer] -> decibels发布于 2013-09-06 08:10:54
Thx到Donal Felows,我发现问题是,不是,shell,引用,而是,tcl语法。因此,我修改了整个答覆,建议如下:
exec /bin/bash -c {amixer sget Master | awk -F"[][]" '/dB/{print $2}'}或者,如果您喜欢使用进程替换而不是管道:
exec /bin/bash -c {awk -F"[][]" '/dB/{print $2}' <(amixer sget Master)}这两行都使用{...}语法从tcl解释中转义bash代码,从而允许在两者之间使用普通的bash代码。
我不确定这是否是最好的方法,因为它基本上将所有工作从tcl转移到bash,但至少这对我是有用的(使用tcl 8.5.13-r1、GNU bash 4.2.45(1)和GNU awk 4.0.1)。
https://stackoverflow.com/questions/18651444
复制相似问题