是执行linux命令的任何方式,如;exec cat spec.txt“切割-d”|&引用-f 2“;在tclsh
我有一个spec.txt,如下所示,可以在linux shell中运行“cat spec.txt | cut-d”|“-f2”命令是执行linux命令的任何方式,如;exec cat spec.txt“切割-d”|&引用-f 2“;在tclsh,tcl,Tcl,我有一个spec.txt,如下所示,可以在linux shell中运行“cat spec.txt | cut-d”|“-f2”命令 user@test-server:~/auto/acpi6/main/spec$ cat spec.txt a1 | BMC_HEALTH | 0x0 | discrete | 0x0000| na | na | na | na | na | na user@tes
user@test-server:~/auto/acpi6/main/spec$ cat spec.txt
a1 | BMC_HEALTH | 0x0 | discrete | 0x0000| na | na | na | na | na | na
user@test-server:~/auto/acpi6/main/spec$ cat spec.txt | cut -d "|" -f 2
BMC_HEALTH
->为什么它不能运行命令
"exec cat spec.txt | cut -d "|" -f 2" in tclsh
% exec cat spec.txt | cut -d "|" -f 2
couldn't execute "-f": no such file or directory
问题在于,Tcl标准解释器规则在
exec
看到它之前,将带引号的|
转换为未带引号的裸解释器。这是Tcl的常规语法规则(否则这是一件非常好的事情)发挥作用的地方之一
最简单的解决方法是使用sh
作为中介
exec cat spec.txt | sh -c {exec cut -d "|" -f 2}
大括号中的部分是shell语法,而不是Tcl,因此可以处理这种情况 也许是“周围”的问题?你试过逃离它们吗?(比如“\”\)您是否考虑过在Tcl中编写解析而不是启动新程序?管道字符是Tcl的exec命令所特有的,不能转义。这是
exec
中典型的棘手案例之一。没有好的方法引用它,我们知道这是一个问题。如果不创建其他更常见的用例,就无法很好地修复它更糟糕的是,我们一直在担心它,而没有解决它。