gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:04:24 25 4
gpt4 key购买 nike

我有一个 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 。因此,您需要做的是获取生成子 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 更具移植性

关于bash - 找出哪个 shell tcsh/bash/etc。在脚本上使用 eval 时正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66436617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com