找出哪个 shell tcsh/bash/etc。在脚本上使用 eval 时为 运行

find out which shell tcsh/bash/etc. is running when eval is used on script

我有一个 shell 脚本,可以导出要在多用户环境的工具设置中使用的变量。由于不同的项目(100 多个项目的历史)使用不同的设置,我的脚本设置了不同 shell 种类的变量。

示例:

#!/bin/sh

#some XY_VAR setting happening here

case "" 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 时都失败了。

有人可以帮忙吗?可能是我太笨了,自己找解决办法。

谢谢和最诚挚的问候 rws

$$指的是当前进程;在您的情况下,这是由反引号生成的 shell 。因此,您需要做的是获取生成 subshell: 父进程的进程的 pid。一个例子可能是:

comm=$(ps -ho comm $(ps -ho ppid $$))
echo "echo \"$comm\""

首先运行s ps -ho ppid $$获取父pid,然后运行s另一个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

鱼 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(或 Linux 与不同的 ps?) 所以您可能需要稍微熟悉一下命令,但这应该能为您指明正确的方向。

此外,如果您 运行 通过另一个脚本执行此操作,您可能需要获取父项的父项。


如果您使用的是 Linux,那么另一个选项是使用 /proc 文件系统:

ppid=$(cat "/proc/$$/status" | grep ^PPid: | awk '{print }')
comm=$(cat "/proc/$ppid/status" | grep ^Name: | awk '{print }')
echo "echo \"$comm\""

但这只适用于 Linux。 ps 有点乱,难以移植,但肯定比 Linux 的 procfs 更便携