我连接到远程外壳,许多键无法正常工作,例如箭头和转义键。这个答案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文件系统。每个进程都有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(例如 Mac OS X)。
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 变量不会为 subshells 改变的原因。例如,无论我生成多少壳,$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 的可靠方法。了解流程更可靠
Anw*_*war 10
您正在使用sh. 因为$SHELL指的是登录shell,而不是当前正在使用的shell。
您提供的StackOverflow 问题链接具有正确确定当前正在运行的 shell 的正确方法。