我想在sh
或execve(2)
中执行相当于exec
的操作,只需将控制权从tcl转移到被调用的命令,然后再也不返回,这样发送到曾经是tcl进程的任何信号都会直接发送到被调用命令,被调用命令的stdout就是曾经是tcl进程的stdout,等等。
我查阅了手册,但还没有找到在tcl中实现这一点的明显方法。
我不是在谈论tcl的exec
,它使tcl保持运行,创建一个子流程并捕获其输出,然后恢复tcl流程中的控制流。
Tcl本身目前没有任何内置内容,但TclX扩展包含一个命令execl
,它可以完全执行您想要的操作。
package require TclX
execl /bin/bash [list -c somescript.sh]
请注意,执行失败的execl
可能会使进程处于不一致的状态,因为一些库使用钩子来检测底层系统调用并关闭其资源。当然,这完全取决于你在做什么,但由于X11库就是一个值得注意的例子,如果execl
失败,Tk应用程序继续当前进程是不安全的。(fork
/execl
习惯用法——或者Tcl的标准exec
——没有问题,因为问题系统调用总是发生在子流程中。(