我使用 bash 还是 sh?

我使用 bash 还是 sh?

我已连接到远程 shell,但许多键无法正常工作,例如箭头键和 Esc 键。此答案箭头键、Tab 键完成不起作用建议我可能在错误的 shell 中,所以我引用了如何确定当前我正在处理的 shell?。使用所描述的方法,我得到了奇怪的结果。

echo $SHELL 
/bin/bash

echo $0
sh

我使用哪一个 shell?

答案1

使用 proc 文件系统了解 shell 的进程名称

如有疑问,请使用/proc文件系统。每个进程都有文件夹,comm其中包含描述该进程命令的文件。因此,知道 shell 的 PID,我们就可以知道它是什么 shell。

$ echo $$
4824
$ cat /proc/4824/comm                                                          
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash

您还可以参考其他文件来提取相同的信息:

  • /proc/$$/stat
  • /proc/$$/状态
  • /proc/$$/cmdline
  • /proc/$$/exe (可执行文件本身的符号链接)

这可能不适用于较旧的内核或不支持/proc文件系统的系统(例如 Mac OS X)。

使用 ps 命令的相同方法的变体

ps命令有-p标志,允许您指定 pid。我们仍然使用相同的引用$$变量的想法。

$ ps -p $$                                                                     
  PID TTY          TIME CMD
 7728 pts/5    00:00:00 mksh
$ bash
xieerqi@eagle:~$ ps -p $$
  PID TTY          TIME CMD
 7776 pts/5    00:00:00 bash

$0$SHELL

根据建筑维基

SHELL 包含用户的首选 shell。请注意,这不一定是当前正在运行的 shell,尽管 Bash 在启动时设置了这个变量。

换句话说,这是用户的默认交互式 shell,与 中设置的相同/etc/passwd。这也是为什么$SHELL 变量不会因子 shell 而改变。例如,无论我生成多少个壳,$SHELL变量都是不变的:

$ echo $SHELL                                                                  
/bin/mksh
$ bash --posix
bash-4.3$ echo $SHELL
/bin/mksh
bash-4.3$ dash 
$ echo $SHELL
/bin/mksh

$0参数将显示“self” - 程序或文件名称所用的命令。因此,一个简单的脚本如下:

#!/bin/bash
echo $0

将给出如下输出:

$ ./test_script.sh                                                             
./test_script.sh

当你做这样的事情时,这一点也会很明显:

$ echo 'one two three' | xargs bash -c 'echo $0' 
one

对于所有 shell,-c选项将第一个命令行参数放入$0变量中。

就交互式 shell 而言,$0 通常就足够了,但正如您所见,它并不是了解您正在使用的 shell 的可靠方法。了解进程要可靠得多

答案2

您正在使用sh。因为$SHELL指的是登录 shell,而不是当前正在使用的 shell。

您提供的StackOverflow 问题链接具有正确的方法来正确确定当前正在运行的shell。

答案3

如果远程操作系统是 Ubuntu(或其他基于 GNU/Linux 的发行版),那么找出您正在运行的 shell 的一个非常简单的方法是运行以下命令:

ls -l /proc/$$/exe

如果远程操作系统不是Ubuntu 或者至少是类似的 GNU/Linux 发行版,您问错了网站。

如果由于某种原因远程操作系统缺失/proc(例如运行精简版、不完整版或古董版的 Ubuntu,或者可能是容器化的操作系统实例),则上述命令将不起作用。

看看$0会给你一个提示,它不是 100% 可靠的。任何程序都可以将其名称伪装成其他名称。无论如何,你不太可能真正运行sh(真正的 Bourne shell),因为它几乎从未安装在 Linux 上,你可能正在运行一个sh克隆,很可能dash

答案4

已经有很多很棒的答案,但您也可以尝试发出echo $BASH_VERSION。如果打印出版本号,则表示您在 bash 中。如果它输出一个空行,则表示您在其他 shell 中。

相关内容