我怎么知道我的shell是什么类型的

DrH*_*yde 20 unix shell posix

我怎么知道我的shell是什么类型的?即,它是传统的sh,bash,ksh,csh,zsh等.

请注意,检查$SHELL$0不起作用,因为$SHELL并非由所有shell设置,因此如果您从一个shell开始,然后启动另一个shell,您可能仍然使用旧的shell $SHELL.

$0只告诉你shell二进制文件的位置,但不告诉你/bin/sh是真正的Bourne shell还是bash.

我认为答案将是"尝试一些功能,看看有什么打破",所以如果有人能指出我这样做的脚本,那就太好了.

Jen*_*ens 22

这就是我在我的用法.profile:

# .profile is sourced at login by sh and ksh. The zsh sources .zshrc and
# bash sources .bashrc. To get the same behaviour from zsh and bash as well
# I suggest "cd; ln -s .profile .zshrc; ln -s .profile .bashrc".
# Determine what (Bourne compatible) shell we are running under. Put the result
# in $PROFILE_SHELL (not $SHELL) so further code can depend on the shell type.

if test -n "$ZSH_VERSION"; then
  PROFILE_SHELL=zsh
elif test -n "$BASH_VERSION"; then
  PROFILE_SHELL=bash
elif test -n "$KSH_VERSION"; then
  PROFILE_SHELL=ksh
elif test -n "$FCEDIT"; then
  PROFILE_SHELL=ksh
elif test -n "$PS3"; then
  PROFILE_SHELL=unknown
else
  PROFILE_SHELL=sh
fi
Run Code Online (Sandbox Code Playgroud)

它没有在ksh88,ksh95,pdksh或mksh等之间做出细微的区分,但十多年来,它已经证明对我来说是在我所在的所有系统上设计的(BSD,SunOS,Solaris,Linux, Unicos,HP-UX,AIX,IRIX,MicroStation,Cygwin.)

我没有看到需要检查csh .profile,因为csh在启动时获取其他文件.您编写的任何脚本都不需要检查csh vs Bourne-heritage,因为您在shebang行中明确命名了解释器.


ziu*_*ziu 14

尝试使用当前shell PID找到shell路径:

ps -p $$
Run Code Online (Sandbox Code Playgroud)

它应该至少与sh,bash和ksh一起工作.


Nor*_*ray 5

如果您要问的原因是尝试编写可移植的Shell代码,那么发现Shell类型并基于它进行切换是不可靠的策略。可能有太多变化。

根据您在此处的操作,您可能需要查看autoconf文档的相关部分。这包括不同壳像差的有趣的(在某些方面相当令人沮丧的)动物学。

对于可移植代码的目标,本节应非常有帮助。如果确实需要发现shell变体,则可能在autoconf中(或至少在./configure它生成的脚本之一中)埋有一些代码,这将有助于进行嗅探。