我已连接到远程 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 中。