某些Linux命令在tcl shell下无法运行

时间:2013-12-27 11:09:57

标签: linux shell tcl

我无法在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 ~]#

1 个答案:

答案 0 :(得分:6)

user000001是正确的:export是shell的内置函数,exec执行内核系统调用来执行提供的命令,而不是调用shell来执行此操作。

因此,要解决您的问题,您必须明确调用shell:

exec /bin/sh -c {export MIBS=ALL; some_program}

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

关于上面提到的exec号召的两个警告:

  1. 它假设您的系统具有/bin/sh符号链接或真正的shell二进制文件。通过/bin/sh提供的shell必须了解-c命令行选项。

    如果您的/bin/sh不这样做,请使用其他路径名。

  2. 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的同一个脚本中看到它们。

  3. 最后和无关的说明。

    如果你的脚本很大,可以通过命令行将它传递给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