我无法在tcl shell中执行某些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 ~]#
答案 0 :(得分:6)
user000001
是正确的:export
是shell的内置函数,exec
执行内核系统调用来执行提供的命令,而不是调用shell来执行此操作。
因此,要解决您的问题,您必须明确调用shell:
exec /bin/sh -c {export MIBS=ALL; some_program}
其中some_program
是一个程序,它应该在运行时在其环境块中看到MIBS
变量。
关于上面提到的exec
号召的两个警告:
它假设您的系统具有/bin/sh
符号链接或真正的shell二进制文件。通过/bin/sh
提供的shell必须了解-c
命令行选项。
如果您的/bin/sh
不这样做,请使用其他路径名。
shell进程将由exec
生成,然后它将执行通过shell的-c
命令行选项提供的脚本,然后shell将退出。您必须了解shell变量(导出的或其他的)仅存在于它们已创建的shell进程中,因此系列中的第二个调用
exec /bin/sh -c {export FOO=bar}
exec /bin/sh -c {set -u; echo $FOO}
会爆炸,因为只要第一个shell进程退出,FOO
变量就会消失,第二个/bin/sh
进程从Tcl进程获取(继承)一个新的环境副本
你应该从中获取的是你必须设置必要的环境变量和调用程序,这些程序应该在传递给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 $fd
更新以包含Donal Fellows的建议:上面第二个警告的必然结果是,如果您修改自己进程的环境(托管Tcl解释器)然后运行目标程序使用exec
生成的进程将继承您已安装到自己进程的环境块中的环境变量。因此,这也应该做到这一点:
set ::env(MIBS) ALL
exec some_program