我看到环境变量有两种可能的用途SHELL
:
- 它可以用来指定交互的用户想要使用的 shell,和/或
- 进程可以使用它来执行其他命令,替换通常的
/bin/sh -c "..."
习惯用法中的命令。
如果仅用于前者,可能会很奇怪(例如ipython
),如果也用于后者,则需要提供POSIX兼容性的基本形式,例如理解参数-c
并保持环境完整(这非常棘手)。
这POSIX标准这里不是很明确,只是这样写。
该变量应表示用户首选命令语言解释器的路径名。如果此解释器不符合 IEEE Std 1003.1-2001 第 2 章 Shell 命令语言的 Shell 和实用程序卷中的 Shell 命令语言,则实用程序的行为可能与 IEEE Std 1003.1-2001 中描述的不同。
第二种用途实际上是常见的和/或有效的,因此如果我设置为奇怪的东西,需要担心什么SHELL
?
答案1
POSIX C API 均未SHELL
显式使用环境变量。这system
和popen
函数必须调用一个名为 的程序sh
。一些实用程序(例如ex
,mailx
, …) 必须使用$SHELL
, 但始终执行用户提供的代码;make
明确忽略$SHELL
.
该部分关于环境变量允许公用事业$SHELL
,但如果不符合 POSIX sh,则 C API(“系统接口”)不会有不同的行为。
实际上,SHELL
设置为用户的登录 shell,它可能兼容也可能不兼容 POSIX。兹什和鱼是流行的替代品。我在各种 Unix 变体上使用 zsh 已经有十年了,我不记得有任何系统实用程序失败。我偶尔会看到一些草率编写的代码调用$SHELL
而不是sh
执行 sh 脚本。这种情况非常罕见,并且不会阻止您设置SHELL
为您喜欢的任何内容。
简而言之,是的,SHELL
这是您最喜欢的交互式 shell,应用程序无法保证它接受什么语法,甚至不保证它是否接受选项-c
。