在tcl中,如何写入我所在shell中的变量?

zed5wv10  于 2023-03-03  发布在  Shell
关注(0)|答案(2)|浏览(293)

在一个tcl shell中,我想用一个变量来存储我在哪个shell中。这个脚本也是为了让其他人运行的,我需要检查他们在哪个shell中。
我尝试使用exec,但我在将结果存储在一个可以与字符串进行比较的变量中时遇到了麻烦,基本上,我想找出用户是在bash、csh还是ksh中。用户在shell之间切换,因此有必要确定他们所在的活动shell。我尝试:

set shell [exec echo \$0]
puts stdout "echo $shell;"

if { [string first "bash" $shell] != -1 } {
puts stdout "echo should be bash, is $shell;"
} elseif { [string first "ksh" $shell] != -1 } {      
puts stdout "echo should be KSH, is $shell;"
} else {
puts stdout "echo should be csh, is $shell;"
}

不幸的是,这只会将字符串$0写入shell,而不是实际的shell。有没有其他方法可以做到这一点?对于上下文,这是针对linux上的modulefile,它允许我(和其他人)为特定的软件包设置适当的环境。
模块文件具有
设置shell [模块信息shell]
但这不会产生活性壳。
编辑:
澄清一下,我想知道我在哪个shell中,这样我就可以运行

something.sh if I am in bash
something.ksh if I am in ksh
something.csh if I am in csh

所有这些脚本在用户想要运行的软件能够在给定的shell中运行之前必须做一些稍微不同的事情。2这将在终端中被调用,并且用户想要使用的软件也将在该终端中运行。
谢谢!

ux6nzvsh

ux6nzvsh1#

如果你想知道的是SHELL环境变量的值,Tcl提供了一个名为env的全局数组,它包含了Tcl shell启动的环境。

set myshell $::env(SHELL)

您将需要处理未定义SHELL的情况,但这是另一个问题。

hc8w905p

hc8w905p2#

这里假设tcl进程的父进程是shell,但是避免了$::env(SHELL)的问题:

stemoo01 > echo $SHELL
/bin/tcsh
stemoo01 > tclsh
% puts $::env(SHELL)
/bin/tcsh
% regexp {(\w+)$} [exec ps -hp [exec ps -o ppid= -p [pid]]] all match
1
% puts $match
csh

stemoo01 > bash
bash-4.2$ echo $SHELL
/bin/tcsh
bash-4.2$ tclsh
% puts $::env(SHELL)
/bin/tcsh
% regexp {(\w+)$} [exec ps -hp [exec ps -o ppid= -p [pid]]] all match
1
% puts $match
bash

相关问题