Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Tcl中执行管道shell命令_Shell_Tcl - Fatal编程技术网

在Tcl中执行管道shell命令

在Tcl中执行管道shell命令,shell,tcl,Shell,Tcl,我想在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

我想在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脚本中执行初始管道命令

谢谢

问题出在这里

您需要将它从tcl和shell中解救出来,才能使它在这里工作

exec grep -v "#" inputfile | grep -v {\\>} | sort -r -nk7 | head
或者这更好,因为你少了一个grep

如果您在使用Tcsh或类似工具运行此程序的目录中查找,您可能会看到您创建了一个名称奇怪的文件,即|之前。

该>在这里造成了问题

您需要将它从tcl和shell中解救出来,才能使它在这里工作

exec grep -v "#" inputfile | grep -v {\\>} | sort -r -nk7 | head
或者这更好,因为你少了一个grep

如果您在使用Tcsh或类似工具运行此程序的目录中查找,您可能会看到您在纯Tcl中创建了一个名称奇怪的文件,即|之前。

package require fileutil

set lines {}
::fileutil::foreachLine line inputfile {
    if {![regexp #|> $line]} {
        lappend lines $line
    }
}
set lines [lsort -decreasing -integer -index 6 $lines]
set lines [lrange $lines 0 9]
puts [join $lines \n]\n
-double可能比-integer更合适

编辑:在为lsort编写基于0的索引选项时,我错误地将基于1的-k索引转换为命令排序。现在已经纠正了

文档:纯Tcl中的包、、、

package require fileutil

set lines {}
::fileutil::foreachLine line inputfile {
    if {![regexp #|> $line]} {
        lappend lines $line
    }
}
set lines [lsort -decreasing -integer -index 6 $lines]
set lines [lrange $lines 0 9]
puts [join $lines \n]\n
-double可能比-integer更合适

编辑:在为lsort编写基于0的索引选项时,我错误地将基于1的-k索引转换为命令排序。现在已经纠正了

文档:package,,,,,

问题在于,当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上…

问题是,当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上…

@Etan Reissne我尝试过,例如:>exec{grep-v cg_metrics.rpt | grep-v>}但是我得到了:错误:无法执行grep-v cg_metrics.rpt | grep-v>:没有这样的文件或目录ThanksIt仍然给出错误:>exec{bash-c'grep-vcg_metrics.rpt | grep-v>'}错误:无法执行bash-c'grep-vcg_metrics.rpt | grep-v>':没有此类文件或directory@EtanReissne我试过,例如:>exec{grep-vcg_metrics.rpt | grep-v>}但是我得到了:错误:无法执行grep-vcg_metrics.rpt | grep-v>:没有这样的文件或目录ThanksIt仍然给出错误:>exec{bash-c'grep-vcg_metrics.rpt | grep-v>}错误:无法执行bash-c'grep-v cg_metrics.rpt | grep-v>':没有这样的文件或目录这不会给出错误,但恐怕不起作用。它不会跳出包含´´或´的行。确实已按您所述创建了一个文件。谢谢您可能需要grep-E。它适用于我grep-E。您使用的是什么版本的greping?我使用的是版本8.5。这不会给出错误,但恐怕不起作用。它不会跳过包含´´或>”的行。确实,正如您所描述的那样创建了一个文件。谢谢您可能需要grep-E。它对我来说适用于grep-E。您使用的是什么版本的grep?我使用的是版本8.5