如何确定我正在使用的当前shell?
我如何确定我正在使用的当前shell?
ps命令的输出是否足够?
这怎么能在不同风格的UNIX中完成呢?
有三种方法来查找当前shell的可执行文件的名称 :
请注意,如果shell的可执行文件是/bin/sh但所有3种方法都可能被愚弄,但它实际上是一个重命名的bash ,例如(经常发生)。
因此,你的第二个问题是ps输出是否会被“ 不总是 ”回答。
echo $0 - 将打印程序名称......在shell中是实际的shell
ps -ef | grep $$ | grep -v grep ps -ef | grep $$ | grep -v grep - 这将查找正在运行的进程列表中的当前进程ID。 由于当前进程是shell,因此它将被包含在内。
这不是100%可靠的,因为你可能有其他进程的ps列表包含与shell的进程ID相同的数字,特别是如果该ID是小#(例如,如果shell的PID是“5”,你可能会发现名为“java5”的进程“或”perl5“在同一个grep输出!)。 这是“ps”方法的第二个问题,除了不能依赖shell名称之外。
echo $SHELL - 当前shell的路径存储为任何shell的SHELL变量。 需要注意的是,如果你明确地启动一个shell作为一个子进程(例如它不是你的登录shell),你将会得到你的登录shell的值。 如果这是可能的话,请使用ps或$0方法。
但是,如果可执行文件与实际的shell不匹配(例如/bin/sh实际上是bash或ksh),则需要启发式。 以下是一些特定于各种炮弹的环境变量:
$version在tcsh上设置
$BASH在bash上设置
$shell (小写)在csh或tcsh中设置为实际的shell名称
$ZSH_NAME在zsh上设置
ksh设置了$PS3和$PS4 ,而普通的Bourne shell( sh )只设置了$PS1和$PS2 。 这通常看起来最难分辨 - 我们在Solaris $FCEDIT上安装的sh和ksh之间的整套环境变量的唯一区别是$ERRNO , $FCEDIT , $LINENO , $PPID , $PS3 , $PS4 , $RANDOM , $SECONDS , $TMOUT 。
ps -p $$
应该在涉及ps -ef和grep的解决方案(在支持ps POSIX选项的任何Unix变体上)的任何地方工作,并且不会受到通过对可能在其他地方出现的数字序列进行grepping引入的误报的影响。
尝试
ps -p $$ -oargs=
要么
ps -p $$ -ocomm=
链接地址: http://www.djcxy.com/p/97101.html
