根据 Daniel J. Barrett 的 O'Reilly Linux pocket 指南,该命令echo $shell
应该打印出当前使用的 shell。
当我从终端运行该命令时,我得到了一个空行。我的理解是,如果您打开了终端,则应该有一个 shell 正在运行,因此我很困惑为什么它会打印出空白。
raven# echo $shell
raven#
答案1
只有csh
/ tcsh
shell 设置$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_VERSION
ksh
${.sh.version}
$YASH_VERSION
yash
在 Linux 上,您还可以使用readlink "/proc/$$/exe"
这些 shell 来获取 shell 解释器的路径,其中$$
扩展为执行解释器的进程的 pid(类似 Bourne、类似 csh;请参阅$fish_pid
in fish
、$pid
inrc
类似 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 fish
or zsh
shell 中:
printf '%s\n' $SHELL
不是(尽管当您不知道正在运行哪个 shell 时,这可能是一个足够好的近似值,在大多数情况下应该适用于大多数 shell)。echo $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 的回答中所指出的。