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

时间:2011-03-02 11:11:51

标签: shell unix posix

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

请注意,检查$SHELL$0将无效,因为所有shell都未设置$SHELL,因此如果您从一个shell开始,然后启动另一个shell,则可能还有旧$SHELL

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

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

7 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:14)

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

ps -p $$

至少应该使用sh,bash和ksh。

答案 2 :(得分:5)

如果您要求的原因是尝试编写可移植的shell代码,那么发现shell类型并根据它进行切换是一种不可靠的策略。可能存在太多变化。

根据您在此处所做的事情,您可能需要查看the relevant part of the autoconf documentation。这包括一个有趣的(在某些方面相当令人沮丧)不同壳体畸变的动物学。

对于可移植代码的目标,本节应该非常有用。如果你确实需要发现shell变种,那么可能会有一些代码隐藏在autoconf中(或者至少在它生成的./configure脚本中),这将有助于嗅探。

答案 3 :(得分:3)

您可以使用以下内容:

shell=`cat /proc/$$/cmdline`;

答案 4 :(得分:0)

哦,我有这个问题。 :D

有一个快速入侵,使用ps -p $$命令列出当前正在运行的进程的PID进程 - 这是你的SHELL。这将返回一个字符串表结构,如果需要,你可以将AWK或SED shell输出......

答案 5 :(得分:0)

这是旧线程但是......

在GNU环境中,您可以sh --help获得类似

的内容
BusyBox v1.23.2 (2015-04-24 15:46:01 GMT) multi-call binary.

Usage: sh [-/+OPTIONS] [-/+o OPT]... [-c 'SCRIPT' [ARG0 [ARGS]] / FILE [ARGS]]

Unix shell interpreter

所以,第一行是shell type =)

答案 6 :(得分:-1)

当您打开一个未设置为bash以外的新终端窗口时,您会看到系统shell(假设这是您的默认SHELL)。

echo $SHELL

通常,您可以找到运行

定义的所有常量

set

如果输出很多,那就运行

set | less

因此您可以从命令行顶部或

滚动它

set > set.txt

将输出保存到文件中。

调用另一个交互式shell在你的终端中进行bash 意味着你的系统shell被改为其他东西,即你的系统shell被设置为bash虽然你从bash shell调用一个csh shell就是那个会议。

以上意味着在bash中键入/bin/csh/bin/python或者根本没有将系统shell设置为您调用的shell。

如果你真的想看到SHELL常量变化,那么你需要将它设置为其他东西。如果成功,只要你打开一个新的终端,你就应该看到新的shell ...