为什么 echo $shell 会输出空白?

为什么 echo $shell 会输出空白?

根据 Daniel J. Barrett 的 O'Reilly Linux pocket 指南,该命令echo $shell应该打印出当前使用的 shell。

当我从终端运行该命令时,我得到了一个空行。我的理解是,如果您打开了终端,则应该有一个 shell 正在运行,因此我很困惑为什么它会打印出空白。

raven# echo $shell

raven#

答案1

只有csh/ tcshshell 设置$shell变量。因此,如果从这些 shell 之一运行,您只能使用该命令获得 shell 的路径echo $shell,也许您在那本书中讨论这些内容的部分中找到了这一点。

login或其他登录管理器设置SHELL 环境passwd变量到您的登录 shell(您帐户的数据库中提到的 shell ),这些 shell 将始终映射到其相应的$SHELL变量,并且它是您想要设置为首选 shell 的环境变量,用于终端仿真器或vi启动它而不是你的登录外壳。

但这不一定是外壳目前正在使用

如果您在一个环境中启动了终端仿真器,并且该$SHELL变量自登录以来尚未被修改,并且您的终端仿真器未以其他方式配置为启动与存储在 中的 shell(或其他命令)不同的 shell(或其他命令)$SHELL,那么就会出现这种情况尚未启动不同的 shell,或者未在shell 启动序列$SHELL中修改变量。$SHELL

没有 shell 变量可以告诉您正在使用哪个 shell,而不管 shell 是什么,尽管在 ksh93 的某些实现中,除了 (t)csh's 之外$shell,还有bash's$BASH$BASH_VERSION/ $BASH_VERSINFO, zsh's $ZSH_VERSION,其中可以帮助您知道您使用的是哪个 shell正在运行。$KSH_VERSIONksh${.sh.version}$YASH_VERSIONyash

在 Linux 上,您还可以使用readlink "/proc/$$/exe"这些 shell 来获取 shell 解释器的路径,其中$$扩展为执行解释器的进程的 pid(类似 Bourne、类似 csh;请参阅$fish_pidin fish$pidinrc类似 shell)。

更方便的是,sh -c 'ps -o comm= -p "$PPID"'将为您提供 的父进程的名称sh,该进程应该运行 shell目前正在使用,并且该进程的名称应源自 shell 解释器可执行文件的基本名称。所有常见的 shell 都应该以相同的方式解释该代码,本站点范围内的所有系统都应该具有可以理解该代码的sh和命令。ps

要在类似 Bourne 的 shell 中打印变量的内容,后跟换行符,语法为:

printf '%s\n' "$SHELL"

或者在csh

printf '%s\n' $SHELL:q

或者在rc-like or fishor zshshell 中:

printf '%s\n' $SHELL

不是echo $SHELL(尽管当您不知道正在运行哪个 shell 时,这可能是一个足够好的近似值,在大多数情况下应该适用于大多数 shell)。

要知道哪个是您的登录 shell(存储在passwd数据库中),在许多系统上,您可以执行以下操作(Bourne 语法):

getent -- passwd "$LOGNAME" | cut -d: -f7

或者在没有实用程序的系统上getent

perl -le 'print((getpwnam getlogin)[8])'

¹ 但前提是$shell不包含通配符,并且也可能被破坏而echo无法输出任意数据

答案2

Shell 变量名称区分大小写。这约定是环境变量的名称全部大写。你应该输入

echo $SHELL

反而。正如@StephenKitt 所指出的,这也是书中实际说明的命令。

一般而言,用于echo打印 shell 变量内容的是变得灰心丧气printf,正如@Stéphane Chazelas 的回答中所指出的。

相关内容