使用“SHELL”环境变量

使用“SHELL”环境变量

我在 OSX 上。我最近开始使用 fish shell。我注意到

echo $SHELL

仍然给我回报

/bin/bash

即使在我设置了终端以使用 fish shell 之后,并在所述 fish shell 中执行命令时也是如此。(fish shell 的路径是/usr/local/bin/fish。)同样,如果我运行 python 程序

import os
print(os.environ['SHELL'])

从 fish shell 内部我得到的/bin/bash是输出,而不是/usr/local/bin/fish

所以我想知道,如果它没有显示当前 shell 的类型,那么 SHELL 环境变量有什么意义呢?

答案1

根据 BASH 的源代码,$SHELL环境变量设置为返回用户的默认 shell。这是从用户的配置文件中检索的(/etc/passwd如果您愿意的话)。

Python 只是返回其父级(bash 或 fish)提供给它的环境变量,所以这不是 Python/Perl/etc 的错误。

话虽如此,如果你想知道你实际使用的是什么 shell,推荐的方法是查看特殊变量$0,它应该返回类似-bash或 的内容/usr/local/bin/fish。但是,这只能在 shell 内部工作,因为 Python/Perl/etc 可能会返回它们的解释器路径。

那么变量的用途是什么?这是 UNIX 的特性 - 如果您创建会话,这将反映已设置为默认程序的内容,操作系统将在登录时运行该程序并将其附加到您的会话并处理 STDIN/STDOUT。此默认程序将成为您从那里启动的所有内容的父程序。

是的,从技术上讲,您可以将其设置为任何值,但 sh/ksh/bash/zsh/fish 是典型的,尽管在管理员不希望 shell 访问的环境中将其设置为打印“不允许交互式 shell”并退出并不罕见。但话虽如此,如果您想将其默认为 fish,则需要在用户帐户中进行设置。

答案2

看来 Python 正在使用 /etc/passwd 中列出的用户 shell。我不知道 Mac 上的等效 shell 在哪里。即使终端使用的是 fish,您的用户条目可能仍会列出 bash。示例:

samuel:x:1000:1000:Samuel:/home/samuel:/bin/bash

从 python 给我'/bin/bash'。

samuel:x:1000:1000:Samuel:/home/samuel:/usr/bin/zsh

从 python 给我'/usr/bin/zsh'。

您必须注销或重新启动系统才能使更改生效。

相关内容