我怎么知道我的shell是什么类型的?即,它是传统的sh,bash,ksh,csh,zsh等。
请注意,检查$SHELL
或$0
将无效,因为所有shell都未设置$SHELL
,因此如果您从一个shell开始,然后启动另一个shell,则可能还有旧$SHELL
。
$0
只告诉你shell二进制文件的位置,但不告诉你/bin/sh
是真正的Bourne shell还是bash。
我认为答案将是“尝试一些功能,看看有什么打破”,所以如果有人能指出我这样做的脚本,那就太好了。
答案 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 ...