我有一个shell脚本,它导出用于多用户环境的工具设置的变量。由于不同的项目(100多个项目的历史)使用不同的设置,我的脚本为不同的shell设置变量。
的例子:
#!/bin/sh
#some XY_VAR setting happening here
case "$1" in
'-c')
echo "setenv XY $XY_VAR;"
;;
'-b')
echo "export XY=$XY_VAR;"
;;
esac
在项目脚本中使用时,它的计算方式如下
eval `set_my_vars -c` #when using (t)c-shell
eval `set_my_vars -b` #when using bash
我的问题是,我可以让脚本检测shell,它被评估,并输入到case语句?
ps -hp $$
在执行脚本时不起作用,这是我的第一个想法(当然是使用awk)。我已经找到了多种方法,人们想要检测他们在哪个shell中运行,但我发现当使用eval时都失败了。
有人能帮忙吗?也许是我太傻了,自己找不到解决办法。
感谢并致以最良好的问候遥控武器站
$$
为当前工艺;在你的例子中,它是由反引号生成的shell。因此,您需要做的是获取产生子shell的进程的pid:父进程。例如:
comm=$(ps -ho comm $(ps -ho ppid $$))
echo "echo "$comm""
首先运行ps -ho ppid $$
以获取父pid,然后运行另一个ps -ho comm
以从父pid获取命令名。
然后使用:
eval `./sourceme`
将打印期望的值:
[~]% eval `./sourceme`
zsh
$ sh
$ eval `./sourceme`
sh
$ csh
% eval `./sourceme`
csh
% bash
[~]$ eval `./sourceme`
bash
[~]$ osh
osh$ eval `./sourceme`
osh
fish shell需要稍微不同的语法:
osh$ fish
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
martin@e585 ~> eval `./sourceme`
fish: Unknown command: `./sourceme`
martin@e585 ~> eval (./sourceme)
fish
我只在Linux上测试了这个;由于您的ps
示例在我的系统上给出了一个错误("不支持SysV选项"),看起来您可能没有使用Linux(或具有不同ps
的Linux ?),因此您可能需要稍微使用这些命令,但这应该有望为您指明正确的方向。
另外,如果您通过另一个脚本运行此脚本,您可能需要获得父节点的父节点。
如果你使用的是Linux,那么另一个选择是使用/proc文件系统:
ppid=$(cat "/proc/$$/status" | grep ^PPid: | awk '{print $2}')
comm=$(cat "/proc/$ppid/status" | grep ^Name: | awk '{print $2}')
echo "echo "$comm""
但是这只能在Linux上工作。ps
有点乱,难以移植,但它肯定比Linux的procfs更具可移植性。