我无法在tcl中执行一些Linux命令。
例如..。
1)
% exec "export MIBS=ALL"
couldn't execute "export MIBS=ALL": no such file or directory
%2)
% pwd
/root
%3)
% exec pwd
/root
%在第一种情况下,我为什么不能执行命令..
这个命令在内核中很好。
[root@6 ~]# export MIBS=ALL
[root@6 ~]#发布于 2013-12-27 12:31:39
user000001是正确的:export是shell的内部结构,exec执行内核syscall来执行提供的命令,而不是调用shell来执行。
因此,要解决问题,必须显式调用shell:
exec /bin/sh -c {export MIBS=ALL; some_program}其中some_program是一个程序,它在运行时应该在其环境块中看到MIBS变量。
关于上述对exec的调用,有两个注意事项:
/bin/sh符号链接或真正的shell二进制文件。通过/bin/sh提供的shell必须理解-c命令行选项。
如果您的/bin/sh没有这样做,请使用另一个路径名。exec将生成一个shell进程,然后它将执行通过shell的-c命令行选项提供的脚本,然后shell将退出。您必须理解shell变量(导出的或其他的)只存在于在其中创建的shell进程中,因此是系列中的第二个调用。
exec /bin/sh -c {export FOO=bar} exec /bin/sh -c {set -u;echo $FOO}
因为一旦第一个shell进程退出,FOO变量就会随之消失,而第二个/bin/sh进程将从您的/bin/sh进程获得(继承)一个新的环境副本。
您应该从中得到的是,您必须设置必要的环境变量,并调用程序,该程序将在传递给shell的同一个脚本中看到它们。最后也是不相关的音符。
如果您的脚本要大,那么不通过命令行将其传递给shell,而是通过其标准输入将其传递给shell可能是有意义的,如下所示:
set fd [open {|/bin/sh} r+]
puts $fd {
set -e -u
echo test
cat /path/to/whatever
...
}
# Read the shell's response
set out [read $fd]
# The following call will throw an exception if the shell
# exits with a non-zero exit code or wrote something to its
# standard error stream. You might want to [catch] it.
close $fdUpdate以包含Donal研究员的建议:上面第二个警告的推论是,如果您修改您自己进程的环境(它承载了Tcl解释器),然后使用exec运行目标程序,则生成的进程将继承您已安装到您自己进程的环境块中的环境变量。因此,这也应该起到了作用:
set ::env(MIBS) ALL
exec some_programhttps://stackoverflow.com/questions/20799644
复制相似问题