00234dcd2c32a4e5f1d29b399bab35cceb5d22dd
[shellsnippets/shellsnippets.git] / other / getshver
1 # $MirOS: contrib/code/Snippets/getshver,v 1.15 2012/09/23 15:50:16 tg Exp $
2 #-
3 # Copyright (c) 2009, 2010, 2011, 2012
4 #       Thorsten Glaser <tg@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 x$SHELL_VERSION in
98 x) ;;
99 *[0-9]*build*)
100         if ( (set -o korn) && (set -o bash) ) >&- 2>&-; then
101                 # MKS {,Korn,Bash} Shell (fixed by Michael Langguth)
102                 ( # subshell, just in case
103                 typeset _o
104
105                 _o=`set -o`
106                 if [ -z "${_o##*-o bash*}" ]; then
107                         echo "mksbash $SHELL_VERSION"
108                 elif [ -z "${_o##*-o korn*}" ]; then
109                         echo "mksksh $SHELL_VERSION"
110                 else
111                         echo "mkssh $SHELL_VERSION"
112                 fi ) || echo "mks $SHELL_VERSION"
113                 exit 0
114         fi
115         ;;
116 esac
117
118 x=
119 case x$BASH_VERSION in
120 # no GNU bash
121 x) ;;
122 # known GNU bash versions
123 x2*) x=bash2 ;;
124 x3*) x=bash3 ;;
125 x4*) x=bash4 ;;
126 # either bash1 or an unlikely version
127 *) x=bash ;;
128 esac
129 if test x"$x" != x""; then
130         echo "$x $BASH_VERSION"
131         exit 0
132 fi
133
134 # lksh, mksh, mirbsdksh (pre-mksh), oksh (3.7+), pdksh
135 case $KSH_VERSION in
136 *LEGACY\ KSH*) echo "mksh-legacy ${KSH_VERSION#*KSH }" ; exit 0 ;;
137 *MIRBSD\ KSH*) echo "mksh ${KSH_VERSION#*KSH }" ; exit 0 ;;
138 *PD\ KSH*MirOS*) echo "pdksh-mbsd${KSH_VERSION#*PD KSH}"; exit 0 ;;
139 *PD\ KSH*)
140         if test x"`typeset -i10 x=0x10 2>&-; echo $x`" = x"16"; then
141                 # printing KSH_VERSION here is rather useless though
142                 echo "pdksh-obsd ${KSH_VERSION#*KSH }"
143         else
144                 # unspecified: Debian (modern), 5.2.14 (sorta modern),
145                 # some older or vendor-modified version, old oksh
146                 echo "pdksh ${KSH_VERSION#*KSH }"
147         fi
148         exit 0 ;;
149 esac
150 case $SH_VERSION in
151 *PD\ KSH*MirOS*) echo "pdksh-binsh-mbsd${SH_VERSION#*PD KSH}"; exit 0 ;;
152 *PD\ KSH*)
153         if test x"`typeset -i10 x=0x10 2>&-; echo $x`" = x"16"; then
154                 # printing SH_VERSION here is rather useless though
155                 echo "pdksh-binsh-obsd ${SH_VERSION#*KSH }"
156         else
157                 # unspecified: Debian (modern), 5.2.14 (sorta modern),
158                 # some older or vendor-modified version, old oksh
159                 echo "pdksh-binsh ${SH_VERSION#*KSH }"
160         fi
161         exit 0 ;;
162 esac
163
164 x=.sh.version
165 (eval x=\$\{$x\}) 2>&- || x=fail
166 if test fail != "$x"; then
167         if builtin XBell >/dev/null 2>&1; then
168                 eval echo 'dtksh ${.sh.version#Version }'
169         else
170                 eval echo 'ksh93 ${.sh.version#Version }'
171         fi
172         exit 0
173 fi
174 if (
175         typeset _p
176
177         _p='f+([ o])bar'
178         eval [[ foobar = $_p '&&' \"foo bar\" = $_p ]]
179 ) 2>&-; then
180         echo ksh88
181         exit 0
182 fi
183
184 if test x"$POSH_VERSION" != x""; then
185         echo "posix-posh $POSH_VERSION"
186         exit 0
187 fi
188 if ( [[ 0 < 1 ]] ) 2>&-; then
189         echo posix-ext
190         exit 0
191 fi
192 if test x"`
193         foo() {
194                 local a
195
196                 a=2
197         }
198         a=1
199         foo
200         echo $a
201     `" = x"1"; then
202         # we have a working "local"
203         if test x"$(PATH=/nonexistent; export PATH
204             printf 'f%so' o 2>/dev/null)" = x"foo"; then
205                 # probably, but not certain
206                 # also: NetBSD /bin/sh on MirBSD; dash on Debian
207                 echo posix-dash
208                 exit 0
209         fi
210         # test if we fulfil Debian Policy 10.4
211         if ( test 1 -eq 1 -a a = a ) && test x"`echo -n a;
212             echo -n b`" = x"ab"; then
213                 echo posix-debian
214                 exit 0
215         fi
216 fi
217 if test x"`echo -n a; echo -n b`" = x"ab"; then
218         echo posix-echon
219         exit 0
220 fi
221 if test x"`echo a'\c'; echo b`" = x"ab"; then
222         echo posix-echoc
223         exit 0
224 fi
225 echo posix
226 exit 0
227
228 CSH:
229
230 if { bindkey >& /dev/null } then
231         echo "tcsh $tcsh"
232 else
233         echo csh
234 endif
235 exit 0