如何确定我正在使用的当前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