首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$SHELL的目的是什么?

$SHELL的目的是什么?
EN

Stack Overflow用户
提问于 2022-11-09 14:13:25
回答 1查看 25关注 0票数 1

在多个不同的SHELL中,SHELL的值基本上保持不变:

代码语言:javascript
复制
bash$ echo $SHELL
/bin/bash
bash$ csh
csh$ echo $SHELL
/bin/bash
csh$ exec tcsh
csh$ echo $SHELL
/bin/bash
csh$ exec ksh
$ echo $SHELL
/bin/bash
$ exec dash
$ echo $SHELL
/bin/bash
$ exec zsh
zsh$ echo $SHELL
banana
zsh$ exec bash
bash$ echo $SHELL
banana

由于$SHELL对于确定当前运行的shell没有用处,它的目的是什么?

EN

回答 1

Stack Overflow用户

发布于 2022-11-09 14:13:25

正如问题中所指出的,对于确定当前运行的shell来说,SHELL (几乎)是完全没有价值的。尽管$SHELL的值与用户的登录shell之间存在一定的相关性,但这种关系充其量是脆弱的,而且$SHELL无法可靠地确定您当前正在运行的shell。

相反,SHELL的目的是允许用户与系统通信首选项,类似于使用寻呼机或编辑器。如果进程需要用户编辑文件,它应该检查编辑器并打开用户喜欢的编辑器。如果一个进程需要向用户显示文本信息,它应该检查寻呼机的值,以确定使用哪个程序。如果一个进程需要调用一个SHELL来执行命令,它应该执行SHELL中指定的shell。SHELL可能不应该像寻呼机或编辑器那样使用,后者实际上只是用户首选项。它更有可能被用来解决某些行为。例如,如果/bin/sh是一个臃肿的shell,或者一些不严格遵循标准的shell会导致一些模糊的错误,或者即使/bin/sh实际上修复了旧脚本所依赖的错误以获得正确的行为,用户(或者系统,通过默认的启动文件)可能更愿意将SHELL设置为/usr/xpg4/bin/sh之类的东西,从而避免这些问题。

请注意,ksh记录的SHELL用法略有不同,并声明“shell的路径名保存在环境中”。检查代码(https://github.com/ksh2020/ksh/blob/master/src/lib/libast/path/pathshell.c#L104)时,我们发现文档并不十分准确,正如上面看到的行为所反映的那样。bash文档声明“此变量扩展到shell的完整路径名。如果在shell启动时未设置它,bash将为其分配当前用户登录shell的完整路径名”。

大多数用户很可能会将SHELL设置为登录SHELL的值,因此bash的行为是合理的。毕竟,如果您有一个最喜欢的shell,那么使用它作为登录SHELL并将其设置为shell是有意义的。另一方面,如果您使用tclsh或python作为登录shell,那么将SHELL设置为/bin/sh或类似的操作是有意义的。因为许多用户将shell设置为登录shell,所以SHELL的值与您当前使用的shell之间存在相关性,但这种关系肯定不能保证。

在这个问题中,请注意$SHELLzsh中的值设置为banana,该值将持续到下一次对bash的调用中。这有点病态,但可能很有启发性。这里所发生的仅仅是$HOME/.zshrc中的SHELL的值被设置为字符串banana。当调用bash时,该值将被保留。将SHELL设置为他们喜欢的任何值是用户的特权,它不需要以任何方式与当前的shell相关,甚至不需要有任何意义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74376285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档