我使用bash还是sh?

我已连接到远程shell,许多键无法正常工作,如箭头和转义键。 这个回答箭头键,tab-complete不起作用建议我可能在错误的shell中,所以我引用了如何确定我正在处理的当前shell? 。 使用所描述的方法,我得到奇怪的结果。

echo $SHELL /bin/bash 

 echo $0 sh 

我用的是哪个shell?

使用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 vs $SHELL

根据Arch Wiki ,

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是不可靠的方法。 了解这个过程更加可靠

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

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

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

 ls -l /proc/$$/exe 

如果远程操作系统不是 Ubuntu或至少是类似的GNU / Linux发行版,那么你在错误的网站上提问。

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

期待$0将给你一个线索,它不是100%可靠。 任何程序都可以伪造其名称。 在任何情况下,你真的不太可能运行sh (真正的Bourne shell),因为它几乎从未安装在Linux上,你可能正在运行sh clone,可能是dash

你似乎正在使用sh。 要切换到bash你只需输入“bash”

已经给出了很多很棒的答案,但您也可以尝试发出echo $BASH_VERSION 。 如果打印出版本号,那么你就是bash。 如果它输出一个空行,你就在其他shell中。