我在 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'。
您必须注销或重新启动系统才能使更改生效。