如何确定我正在使用的当前shell ?
仅仅ps命令的输出就足够了吗?
如何在不同风格的Unix中实现这一点?
如何确定我正在使用的当前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)。
其他回答
我想到了这个:
sed 's/.*SHELL=//; s/[[:upper:]].*//' /proc/$$/environ
你可以试试:
ps | grep `echo $$` | awk '{ print $4 }'
Or:
echo $SHELL
$SHELL不需要总是显示当前SHELL。它只反映要调用的默认shell。
为了测试上面的测试,假设bash是默认shell,尝试echo $ shell,然后在同一终端,进入其他一些shell(例如KornShell (ksh))并尝试$ shell。在这两种情况下,您将看到结果为bash。
要获得当前shell的名称,使用cat /proc/$$/cmdline。和通过readlink /proc/$$/exe到shell可执行文件的路径。
我特别喜欢Nahuel Fouilleul的解决方案,但我不得不在Ubuntu 18.04 (Bionic Beaver)上使用内置的Bash shell运行它的以下变体:
bash -c 'shellPID=$$; ps -ocomm= -q $shellPID'
没有临时变量shellPID,例如:
bash -c 'ps -ocomm= -q $$'
只会输出ps。也许你们不是都在使用非交互模式,这是有区别的。
下面将始终给出实际使用的shell -它获得实际可执行文件的名称,而不是shell名称(即ksh93而不是ksh,等等)。对于/bin/sh,它将显示实际使用的shell,即破折号。
ls -l /proc/$$/exe | sed 's%.*/%%'
我知道有很多人说ls输出永远不应该被处理,但是您所使用的shell以特殊字符命名,或者位于以特殊字符命名的目录中的可能性有多大?如果情况仍然如此,还有很多其他不同的做法。
正如托比·斯佩特(Toby Speight)所指出的,这将是实现相同目标的更适当、更干净的方式:
basename $(readlink /proc/$$/exe)