如何确定我正在使用的当前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上安装的shksh之间的整套环境变量的唯一区别是$ERRNO$FCEDIT$LINENO$PPID$PS3$PS4$RANDOM$SECONDS$TMOUT


  • ps -p $$

    应该在涉及ps -efgrep的解决方案(在支持ps POSIX选项的任何Unix变体上)的任何地方工作,并且不会受到通过对可能在其他地方出现的数字序列进行grepping引入的误报的影响。


    尝试

    ps -p $$ -oargs=
    

    要么

    ps -p $$ -ocomm=
    
    链接地址: http://www.djcxy.com/p/97101.html

    上一篇: How to determine the current shell I'm working on?

    下一篇: Aborting a shell script if any command returns a non