我使用的是 bash 还是 sh?

Inf*_*5ek 10 bash remote sh

我连接到远程外壳,许多键无法正常工作,例如箭头和转义键。这个答案Arrow keys, tab-complete not working表明我可能在错误的外壳中,所以我参考了如何确定我正在使用的当前外壳?. 使用所描述的方法,我得到了奇怪的结果。

echo $SHELL 
/bin/bash
Run Code Online (Sandbox Code Playgroud)

echo $0
sh
Run Code Online (Sandbox Code Playgroud)

我使用的是哪个外壳?

Ser*_*nyy 13

使用 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
Run Code Online (Sandbox Code Playgroud)

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

  • /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
Run Code Online (Sandbox Code Playgroud)

$0$SHELL.

根据Arch Wiki

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

换句话说,这是用户的默认交互式 shell,与/etc/passwd. 这也是为什么$SHELL 变量不会为 subshel​​ls 改变的原因。例如,无论我生成多少壳,$SHELL变量都不会改变:

$ echo $SHELL                                                                  
/bin/mksh
$ bash --posix
bash-4.3$ echo $SHELL
/bin/mksh
bash-4.3$ dash 
$ echo $SHELL
/bin/mksh
Run Code Online (Sandbox Code Playgroud)

$0参数将显示“self” - 程序或文件名称的命令。所以一个简单的脚本是这样的:

#!/bin/bash
echo $0
Run Code Online (Sandbox Code Playgroud)

会给出这样的输出:

$ ./test_script.sh                                                             
./test_script.sh
Run Code Online (Sandbox Code Playgroud)

当您执行以下操作时,这也很明显:

$ echo 'one two three' | xargs bash -c 'echo $0' 
one
Run Code Online (Sandbox Code Playgroud)

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

就交互式 shell 而言,$0 通常就足够了,但正如您所看到的,这不是了解您正在使用的 shell 的可靠方法。了解流程更可靠

  • @user1800340 现在说得通,是的,你有 2.6 内核:) 你可能只使用 `stat` 文件或 `ps` 版本的方法。如果你正在学习信息安全,这对你来说是一个很好的教训——Linux 的发展,系统的变化,你必须保持开放的心态并明智地选择攻击向量 (2认同)
  • 哇哦,Arch wiki 不仅“不完全正确”,而且完全错误!`$SHELL` 变量与您当前运行的 shell 完全无关。正如你所说,它只是默认的外壳。它与当前运行的 shell 完全没有关系。我已经更正了维基。 (2认同)

Anw*_*war 10

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

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

  • 那个 SO 问题也是 OP 在他/她的问题中引用的内容。:) (2认同)