查找哪个shell tcsh/bash/等.在脚本上使用eval时正在运行



我有一个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更具可移植性。

最新更新