update from MirBSD CVS
[shellsnippets/shellsnippets.git] / other / getshver
1 # $MirOS: contrib/code/Snippets/getshver,v 1.18 2016/04/14 11:55:42 tg Exp $
2 #-
3 # Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2016
4 #       mirabilos <m@mirbsd.org>
5 #
6 # Provided that these terms and disclaimer and all copyright notices
7 # are retained or reproduced in an accompanying document, permission
8 # is granted to deal in this work without restriction, including un-
9 # limited rights to use, publicly perform, distribute, sell, modify,
10 # merge, give away, or sublicence.
11 #
12 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
13 # the utmost extent permitted by applicable law, neither express nor
14 # implied; without malicious intent or gross negligence. In no event
15 # may a licensor, author or contributor be held liable for indirect,
16 # direct, other damage, loss, or other issues arising in any way out
17 # of dealing in the work, even if advised of the possibility of such
18 # damage or existence of a defect, except proven that it results out
19 # of said person's immediate fault when using the work as intended.
20 #-
21 # There's also this one (although mksh never sets $SH_VERSION):
22 # http://www.in-ulm.de/~mascheck/various/whatshell/whatshell.sh.html
23
24 # escape this from tclsh \
25 set x = 1
26 # escape this from tclsh \
27 test 1 = "$x" && goto CSH
28
29 # BEGIN of Tcl section (((
30 # escape this from tclsh \
31 x='
32 if {[info exists ::jim_argv0]} {set v "jimsh"} elseif {[info commands tk] != ""} {set v "wish"} {set v "tclsh"}
33 if {[info exists ::tcl_version]} {
34         append v " " $::tcl_version
35         if {[info exists ::tcl_patchLevel]} {append v " (" $::tcl_patchLevel ")"}
36 } elseif {[info exists ::tcl_patchLevel]} {append v " " $::tcl_patchLevel}
37 set u 0
38 set w " on"
39 if {[info exists ::tcl_platform(machine)]} {set u 1; append w " " $::tcl_platform(machine)}
40 if {[info exists ::tcl_platform(byteOrder)]} {set u 1; append w " (" $::tcl_platform(byteOrder) ")"}
41 if {[info exists ::tcl_platform(os)]} {
42         set u 1
43         append w " " $::tcl_platform(os)
44         if {[info exists ::tcl_platform(osVersion)]} {append w " " $::tcl_platform(osVersion)}
45 } else {append w " unknown"}
46 if {[info exists ::tcl_platform(platform)]} {set u 1; append w " (" $::tcl_platform(platform) ")"}
47 if {$u == 1} {append v $w}
48 set w ","
49 if {[info exists ::tcl_platform(threaded)]} {
50         append w " "
51         if {$::tcl_platform(threaded) != 1} {append w "non"}
52         append w "threaded"
53 }
54 if {[info exists ::tcl_platform(debug)]} {
55         append w " "
56         if {$::tcl_platform(debug) != 1} {append w "non"}
57         append w "debug"
58 }
59 if {[info exists ::tcl_interactive]} {
60         append w " "
61         if {$::tcl_interactive != 1} {append w "non"}
62         append w "interactive"
63 }
64 if {[string equal $w ","] == 0} {append v $w}
65 puts $v
66 exit 0
67 '
68 # ))) END of Tcl section
69
70 LC_ALL=C
71 export LC_ALL
72
73 if test x"`echo u ^ echo x`" = x"x"; then
74         # Bourne shell, maybe Heirloom sh (tested)
75         echo bourne
76         exit 0
77 fi
78 if test x"$(echo u)" != x"u"; then
79         # other non-POSIX shell, maybe Solaris /bin/sh
80         echo binsh
81         exit 0
82 fi
83 # POSIX shell
84
85 case $ZSH_VERSION in
86 *[0-9]*) echo "zsh $ZSH_VERSION"; exit 0 ;;
87 esac
88
89 case $VERSION in
90 zsh*) printf "zsh-old $VERSION"; exit 0 ;;
91 esac
92
93 case $YASH_VERSION in
94 *.*) echo "yash $YASH_VERSION"; exit 0 ;;
95 esac
96
97 case $NETBSD_SHELL in
98 2*) echo "nbsh $NETBSD_SHELL"; exit 0 ;;
99 esac
100
101 case x$SHELL_VERSION in
102 x) ;;
103 *[0-9]*build*)
104         if ( (set -o korn) && (set -o bash) ) >/dev/null 2>/dev/null; then
105                 # MKS {,Korn,Bash} Shell (fixed by Michael Langguth)
106                 ( # subshell, just in case
107                 typeset _o
108
109                 _o=`set -o`
110                 if [ -z "${_o##*-o bash*}" ]; then
111                         echo "mksbash $SHELL_VERSION"
112                 elif [ -z "${_o##*-o korn*}" ]; then
113                         echo "mksksh $SHELL_VERSION"
114                 else
115                         echo "mkssh $SHELL_VERSION"
116                 fi ) || echo "mks $SHELL_VERSION"
117                 exit 0
118         fi
119         ;;
120 esac
121
122 x=
123 case x$BASH_VERSION in
124 # no GNU bash
125 x) ;;
126 # known GNU bash versions
127 x2*) x=bash2 ;;
128 x3*) x=bash3 ;;
129 x4*) x=bash4 ;;
130 # either bash1 or an unlikely version
131 *) x=bash ;;
132 esac
133 if test x"$x" != x""; then
134         echo "$x $BASH_VERSION"
135         exit 0
136 fi
137
138 # AT&T ksh93
139 x=.sh.version
140 (eval x=\$\{$x\}) 2>/dev/null || x=fail
141 if test fail != "$x"; then
142         if builtin XBell >/dev/null 2>&1; then
143                 eval echo 'dtksh ${.sh.version#Version }'
144         else
145                 eval echo 'ksh93 ${.sh.version#Version }'
146         fi
147         exit 0
148 fi
149 # lksh, mksh, mirbsdksh (pre-mksh), oksh (3.7+), pdksh
150 case $KSH_VERSION in
151 *LEGACY\ KSH*) echo "mksh-legacy ${KSH_VERSION#*KSH }" ; exit 0 ;;
152 *MIRBSD\ KSH*) echo "mksh ${KSH_VERSION#*KSH }" ; exit 0 ;;
153 *PD\ KSH*MirOS*) echo "pdksh-mbsd${KSH_VERSION#*PD KSH}"; exit 0 ;;
154 *PD\ KSH*)
155         if test x"`typeset -i10 x=0x10 2>/dev/null; echo $x`" = x"16"; then
156                 # printing KSH_VERSION here is rather useless though
157                 echo "pdksh-obsd ${KSH_VERSION#*KSH }"
158         else
159                 # unspecified: Debian (modern), 5.2.14 (sorta modern),
160                 # some older or vendor-modified version, old oksh
161                 echo "pdksh ${KSH_VERSION#*KSH }"
162         fi
163         exit 0 ;;
164 esac
165 case $SH_VERSION in
166 *PD\ KSH*MirOS*) echo "pdksh-binsh-mbsd${SH_VERSION#*PD KSH}"; exit 0 ;;
167 *PD\ KSH*)
168         if test x"`typeset -i10 x=0x10 2>/dev/null; echo $x`" = x"16"; then
169                 # printing SH_VERSION here is rather useless though
170                 echo "pdksh-binsh-obsd ${SH_VERSION#*KSH }"
171         else
172                 # unspecified: Debian (modern), 5.2.14 (sorta modern),
173                 # some older or vendor-modified version, old oksh
174                 echo "pdksh-binsh ${SH_VERSION#*KSH }"
175         fi
176         exit 0 ;;
177 esac
178 # AT&T ksh88
179 if (
180         typeset _p
181
182         _p='f+([ o])bar'
183         eval [[ foobar = $_p '&&' \"foo bar\" = $_p ]]
184 ) 2>/dev/null; then
185         echo ksh88
186         exit 0
187 fi
188
189 # posh (pdksh without Korn shell)
190 if test x"$POSH_VERSION" != x""; then
191         echo "posix-posh $POSH_VERSION"
192         exit 0
193 fi
194 if ( [[ 0 < 1 ]] ) 2>/dev/null; then
195         echo posix-ext
196         exit 0
197 fi
198 if test x"`
199         foo() {
200                 local a
201
202                 a=2
203         }
204         a=1
205         foo
206         echo $a
207     `" = x"1"; then
208         # we have a working "local"
209         if test x"$(PATH=/nonexistent; export PATH
210             printf 'f%so' o 2>/dev/null)" = x"foo"; then
211                 # probably, but not certain
212                 # also: (old) NetBSD /bin/sh (e.g. on MirBSD); dash on Debian
213                 echo posix-dash
214                 exit 0
215         fi
216         # test if we fulfil Debian Policy 10.4
217         if ( test 1 -eq 1 -a a = a ) && test x"`echo -n a;
218             echo -n b`" = x"ab"; then
219                 echo posix-debian
220                 exit 0
221         fi
222 fi
223 if test x"`echo -n a; echo -n b`" = x"ab"; then
224         echo posix-echon
225         exit 0
226 fi
227 if test x"`echo a'\c'; echo b`" = x"ab"; then
228         echo posix-echoc
229         exit 0
230 fi
231 echo posix
232 exit 0
233
234 CSH:
235
236 if { bindkey >& /dev/null } then
237         echo "tcsh $tcsh"
238 else
239         echo csh
240 endif
241 exit 0