我想在Tcl中执行这些管道shell命令:
grep -v "#" inputfile | grep -v ">" | sort -r -nk7 | head
我试试:
exec grep -v "#" inputfile | grep -v ">" | sort -r -nk7 | head
并收到错误:
Error: grep: invalid option -- 'k'
当我尝试只管道其中两个命令时:
exec grep -v "#" inputfile | grep -v ">"
我明白了:
Error: can't specify ">" as last word in command
更新:我还尝试了{}和{bash -c'...'}:
exec {bash -c 'grep -v "#" inputfile | grep -v ">"'}
Error: couldn't execute "bash -c 'grep -v "#" inputfile | grep -v ">"'": no such file or directory
我的问题:如何在tcl脚本中执行初始管道命令?
由于
答案 0 :(得分:2)
>
在这里造成了问题。
您需要将其从tcl 和 shell中删除,以使其在此处运行。
exec grep -v "#" inputfile | grep -v {\\>} | sort -r -nk7 | head
或(这是更好的,因为你少了grep
)
exec grep -Ev {#|>} inputfile | sort -r -nk7 | head
如果您查看正在运行此目录的目录(假设为tclsh
或类似),您可能会看到之前创建了一个奇怪命名的文件(即|
)。
答案 1 :(得分:2)
纯Tcl:
-double
(-integer
可能比-k
)
编辑:在为{编写{基于0的} sort
选项时,我错误地翻译了命令-index
的基于1的lsort
索引{1}}。现在已经纠正了。
文档:fileutil包,if,join,lappend,lrange,lsort,package,{{ 3}},puts,regexp
答案 2 :(得分:2)
问题在于exec
在自己(或在单词的开头)看到>
时表示“特殊事物”,因为它表示重定向。不幸的是,没有实际的方法可以直接避免这种情况;这是Tcl的语法系统没有帮助的领域。你最终不得不做这样的事情:
exec grep -v "#" inputfile | sh -c {exec grep -v ">"} | sort -r -nk7 | head
您也可以将整个管道移动到Unix shell端:
exec sh -c {grep -v "#" inputfile | grep -v ">" | sort -r -nk7 | head}
虽然坦白说这是你可以在纯Tcl中做的事情,然后它也可以移植到Windows ......