我想做与exec
或sh
中的execve(2)
等效,只是将控制权从tcl转移到被调用的命令,而永不返回,这样任何信号都会发送到过去是tcl进程直接转到被调用的命令,被调用命令的stdout是曾经是tcl进程的stdout,等等。
我在手册中环顾四周,但是在tcl中没有找到一种明显的方法。
我不是在说tcl的exec
,它使tcl保持运行,创建子进程并捕获其输出,然后在tcl进程中恢复控制流。
答案 0 :(得分:3)
目前Tcl本身还没有内置任何功能,但是TclX extension包含一个命令execl
,它可以完全满足您的要求。
package require TclX
execl /bin/bash [list -c somescript.sh]
请注意,execl
操作失败可能会使进程处于不一致状态,因为某些库使用挂钩来检测基础系统调用并关闭其资源。当然,这完全取决于您在做什么,但是由于X11库是一个明显的例子,因此,如果execl
失败,Tk应用程序将无法继续当前的过程。 (fork
/ execl
惯用语或Tcl的标准exec
没问题,因为问题是系统调用总是在子进程中发生。)