如何确定我正在使用的当前shell ?
仅仅ps命令的输出就足够了吗?
如何在不同风格的Unix中实现这一点?
如何确定我正在使用的当前shell ?
仅仅ps命令的输出就足够了吗?
如何在不同风格的Unix中实现这一点?
当前回答
Ps -p $$
应该在涉及ps -ef和grep的解决方案的任何地方工作(在任何支持POSIX选项的ps的Unix变体上),并且不会受到grepping对可能出现在其他地方的数字序列引入的误报的影响。
其他回答
Try
ps -p $$ -oargs=
or
ps -p $$ -ocomm=
下面将始终给出实际使用的shell -它获得实际可执行文件的名称,而不是shell名称(即ksh93而不是ksh,等等)。对于/bin/sh,它将显示实际使用的shell,即破折号。
ls -l /proc/$$/exe | sed 's%.*/%%'
我知道有很多人说ls输出永远不应该被处理,但是您所使用的shell以特殊字符命名,或者位于以特殊字符命名的目录中的可能性有多大?如果情况仍然如此,还有很多其他不同的做法。
正如托比·斯佩特(Toby Speight)所指出的,这将是实现相同目标的更适当、更干净的方式:
basename $(readlink /proc/$$/exe)
不需要从"ps"的输出中Grepping PID,因为你可以从/proc目录结构中读取任何PID的相应命令行:
echo $(cat /proc/$$/cmdline)
然而,这可能并不比简单地:
echo $0
关于运行一个与名称不同的shell,一个想法是使用之前获得的名称从shell请求版本:
<some_shell> --version
sh似乎失败的退出码2,而其他人给出一些有用的(但我无法验证所有,因为我没有他们):
$ sh --version
sh: 0: Illegal option --
echo $?
2
我特别喜欢Nahuel Fouilleul的解决方案,但我不得不在Ubuntu 18.04 (Bionic Beaver)上使用内置的Bash shell运行它的以下变体:
bash -c 'shellPID=$$; ps -ocomm= -q $shellPID'
没有临时变量shellPID,例如:
bash -c 'ps -ocomm= -q $$'
只会输出ps。也许你们不是都在使用非交互模式,这是有区别的。
Ps -p $$
应该在涉及ps -ef和grep的解决方案的任何地方工作(在任何支持POSIX选项的ps的Unix变体上),并且不会受到grepping对可能出现在其他地方的数字序列引入的误报的影响。