【问题标题】:find out which shell tcsh/bash/etc. is running when eval is used on script找出哪个 shell tcsh/bash/etc。在脚本上使用 eval 时正在运行
【发布时间】:2021-05-31 19:59:15
【问题描述】:

我有一个 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 时都失败了。

有人可以帮忙吗?也许我只是愚蠢地自己找到解决方案。

感谢和最好的问候 rws

【问题讨论】:

  • 理论上是正确的,但您仍然可以设置变量并位于其他 shell 中。如果在 tcsh 中设置了 BASH,我的脚本将采用错误的 case 语句

标签: bash shell eval csh tcsh


【解决方案1】:

$$指的是当前进程;在您的情况下,它是由反引号产生的外壳。所以你需要做的是获取产生子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?),因此您可能需要使用命令进行 frob有点,但这应该会为您指明正确的方向。

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


如果您使用的是 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 更便携

【讨论】:

  • 感谢 Martin 的回复和解决方案!我在我的机器上运行 CentOS6/7/8,通过使用case '$comm' ,我现在可以完美地调整我的环境变量以适应我的喜好。非常感谢,谢谢! rws
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 2018-04-17
  • 2013-09-07
  • 2012-09-21
  • 2015-12-10
  • 1970-01-01
相关资源
最近更新 更多