$SHELL 环境变量仅适用于交互式 shell 吗?

$SHELL 环境变量仅适用于交互式 shell 吗?

我看到环境变量有两种可能的用途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显式使用环境变量。这systempopen函数必须调用一个名为 的程序sh。一些实用程序(例如ex,mailx, …) 必须使用$SHELL, 但始终执行用户提供的代码;make明确忽略$SHELL.

该部分关于环境变量允许公用事业$SHELL,但如果不符合 POSIX sh,则 C API(“系统接口”)不会有不同的行为。

实际上,SHELL设置为用户的登录 shell,它可能兼容也可能不兼容 POSIX。兹什是流行的替代品。我在各种 Unix 变体上使用 zsh 已经有十年了,我不记得有任何系统实用程序失败。我偶尔会看到一些草率编写的代码调用$SHELL而不是sh执行 sh 脚本。这种情况非常罕见,并且不会阻止您设置SHELL为您喜欢的任何内容。

简而言之,是的,SHELL这是您最喜欢的交互式 shell,应用程序无法保证它接受什么语法,甚至不保证它是否接受选项-c

相关内容