首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有些Linux命令在tcl shell下无法工作。

有些Linux命令在tcl shell下无法工作。
EN

Stack Overflow用户
提问于 2013-12-27 11:09:56
回答 1查看 796关注 0票数 1

我无法在tcl中执行一些Linux命令。

例如..。

1)

代码语言:javascript
复制
% exec "export MIBS=ALL"
couldn't execute "export MIBS=ALL": no such file or directory
%

2)

代码语言:javascript
复制
 % pwd
    /root
 %

3)

代码语言:javascript
复制
% exec pwd
/root
%

在第一种情况下,我为什么不能执行命令..

这个命令在内核中很好。

代码语言:javascript
复制
[root@6 ~]# export MIBS=ALL
[root@6 ~]#
EN

回答 1

Stack Overflow用户

发布于 2013-12-27 12:31:39

user000001是正确的:export是shell的内部结构,exec执行内核syscall来执行提供的命令,而不是调用shell来执行。

因此,要解决问题,必须显式调用shell:

代码语言:javascript
复制
exec /bin/sh -c {export MIBS=ALL; some_program}

其中some_program是一个程序,它在运行时应该在其环境块中看到MIBS变量。

关于上述对exec的调用,有两个注意事项:

  1. 它假定您的系统具有/bin/sh符号链接或真正的shell二进制文件。通过/bin/sh提供的shell必须理解-c命令行选项。 如果您的/bin/sh没有这样做,请使用另一个路径名。
  2. 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可能是有意义的,如下所示:

代码语言:javascript
复制
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

Update以包含Donal研究员的建议:上面第二个警告的推论是,如果您修改您自己进程的环境(它承载了Tcl解释器),然后使用exec运行目标程序,则生成的进程将继承您已安装到您自己进程的环境块中的环境变量。因此,这也应该起到了作用:

代码语言:javascript
复制
set ::env(MIBS) ALL
exec some_program
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20799644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档