找出哪个 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 更便携。
我有一个 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 更便携。