如何解决找出哪个shell tcsh/bash/etc在脚本上使用 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 时我发现的所有方法都失败了。
有人可以帮忙吗?也许我只是愚蠢到自己寻找解决方案。
谢谢和最好的问候 rws
解决方法
$$
指的是当前进程;在您的情况下,这是由反引号产生的外壳。所以你需要做的是获取产生子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 更便携。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。