如何确定我正在使用的当前shell ?

仅仅ps命令的输出就足够了吗?

如何在不同风格的Unix中实现这一点?


当前回答

一种方法是:

ps -p $$ -o exe=

在我看来,这比在另一个答案中使用-o args或-o comm更好(这些可能会使用一些符号链接,例如当/bin/sh指向某个特定的shell,如Dash或Bash)。

上面返回的是可执行文件的路径,但要注意,由于/usr-merge,可能需要检查多个路径(例如/bin/bash和/usr/bin/bash)。

还要注意,上面的文件并不完全与POSIX兼容(POSIX ps没有exe)。

其他回答

执行以下操作以了解您的shell是否使用Dash/Bash。

ls –la /bin/sh:

如果结果是/bin/sh -> /bin/bash ==>那么你的shell使用的是Bash。 如果结果是/bin/sh ->/bin/dash ==>那么你的shell使用的是dash。

如果你想从Bash更改为Dash或反之亦然,请使用下面的代码:

将shell更改为Bash

注意:如果上述命令导致错误提示/bin/sh已经存在,请删除/bin/sh后重试。

你可以试试:

ps | grep `echo $$` | awk '{ print $4 }'

Or:

echo $SHELL

我的解决方案:

ps -o command | grep -v -e "\<ps\>" -e grep -e tail | tail -1

这应该可以跨不同的平台和shell进行移植。它像其他解决方案一样使用ps,但它不依赖于sed或awk,并过滤掉管道和ps本身的垃圾,因此shell应该始终是最后一个条目。这样我们就不需要依赖不可移植的PID变量或选择正确的行和列。

我已经在Debian和macOS上用Bash、Z shell (zsh)和fish进行了测试(如果不专门为fish更改表达式,大多数解决方案都无法使用,因为它使用了不同的PID变量)。

我有一个简单的技巧来找到当前的壳。只需输入一个随机字符串(这不是命令)。它将失败并返回一个“not found”错误,但在行开始时,它会说它是哪个shell:

ksh: aaaaa: not found [No such file or directory]
bash: aaaaa: command not found

请使用以下命令:

ps -p $$ | tail -1 | awk '{print $4}'