1- #! /usr/ bin/env  sh
1+ #! /bin/sh
22
33# 
4- #  Copyright 2015 the original author or  authors.
4+ #  Copyright ©  2015-2021  the original authors.
55# 
66#  Licensed under the Apache License, Version 2.0 (the "License");
77#  you may not use this file except in compliance with the License.
1717# 
1818
1919# #############################################################################
20- # #
21- # #  Gradle start up script for UN*X
22- # #
20+ # 
21+ #    Gradle start up script for POSIX generated by Gradle.
22+ # 
23+ #    Important for running:
24+ # 
25+ #    (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
26+ #        noncompliant, but you have some other compliant shell such as ksh or
27+ #        bash, then to run this script, type that shell name before the whole
28+ #        command line, like:
29+ # 
30+ #            ksh Gradle
31+ # 
32+ #        Busybox and similar reduced shells will NOT work, because this script
33+ #        requires all of these POSIX shell features:
34+ #          * functions;
35+ #          * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
36+ #            «${var#prefix}», «${var%suffix}», and «$( cmd )»;
37+ #          * compound commands having a testable exit status, especially «case»;
38+ #          * various built-in commands including «command», «set», and «ulimit».
39+ # 
40+ #    Important for patching:
41+ # 
42+ #    (2) This script targets any POSIX shell, so it avoids extensions provided
43+ #        by Bash, Ksh, etc; in particular arrays are avoided.
44+ # 
45+ #        The "traditional" practice of packing multiple parameters into a
46+ #        space-separated string is a well documented source of bugs and security
47+ #        problems, so this is (mostly) avoided, by progressively accumulating
48+ #        options in "$@", and eventually passing that to Java.
49+ # 
50+ #        Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
51+ #        and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
52+ #        see the in-line comments for details.
53+ # 
54+ #        There are tweaks for specific operating systems such as AIX, CygWin,
55+ #        Darwin, MinGW, and NonStop.
56+ # 
57+ #    (3) This script is generated from the Groovy template
58+ #        https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
59+ #        within the Gradle project.
60+ # 
61+ #        You can find Gradle at https://github.com/gradle/gradle/.
62+ # 
2363# #############################################################################
2464
2565#  Attempt to set APP_HOME
66+ 
2667#  Resolve links: $0 may be a link
27- PRG=" $0 " 
28- #  Need this for relative symlinks.
29- while  [ -h  " $PRG "   ] ;  do 
30-     ls=` ls -ld " $PRG " ` 
31-     link=` expr " $ls "   :  ' .*-> \(.*\)$' ` 
32-     if  expr " $link "   :  ' /.*'   >  /dev/null;  then 
33-         PRG=" $link " 
34-     else 
35-         PRG=` dirname " $PRG " ` " /$link " 
36-     fi 
68+ app_path=$0 
69+ 
70+ #  Need this for daisy-chained symlinks.
71+ while 
72+     APP_HOME=${app_path% " ${app_path##*/ } "  }   #  leaves a trailing /; empty if no leading path
73+     [ -h  " $app_path "   ]
74+ do 
75+     ls=$(  ls -ld " $app_path "   ) 
76+     link=${ls#* '  -> '  } 
77+     case  $link  in              # (
78+       /* )   app_path=$link  ;; # (
79+       * )    app_path=$APP_HOME$link  ;;
80+     esac 
3781done 
38- SAVED=" ` pwd` " 
39- cd  " ` dirname \" $PRG \" `  /"   > /dev/null
40- APP_HOME=" ` pwd -P` " 
41- cd  " $SAVED "   > /dev/null
4282
43- APP_NAME=" Gradle" 
44- APP_BASE_NAME=` basename " $0 " ` 
45- 
46- #  Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47- DEFAULT_JVM_OPTS=' "-Xmx64m" "-Xms64m"' 
83+ #  This is normally unused
84+ #  shellcheck disable=SC2034
85+ APP_BASE_NAME=${0##*/ } 
86+ APP_HOME=$(  cd  " ${APP_HOME:- ./ } "   &&  pwd  -P )   ||  exit 
4887
4988#  Use the maximum available, or set MAX_FD != -1 to use that value.
50- MAX_FD=" maximum" 
89+ MAX_FD=maximum
5190
5291warn  () {
5392    echo  " $* " 
54- }
93+ }  >&2 
5594
5695die  () {
5796    echo 
5897    echo  " $* " 
5998    echo 
6099    exit  1
61- }
100+ }  >&2 
62101
63102#  OS specific support (must be 'true' or 'false').
64103cygwin=false
65104msys=false
66105darwin=false
67106nonstop=false
68- case  " ` uname` "   in 
69-   CYGWIN*  )
70-     cygwin=true
71-     ;;
72-   Darwin*  )
73-     darwin=true
74-     ;;
75-   MINGW*  )
76-     msys=true
77-     ;;
78-   NONSTOP*  )
79-     nonstop=true
80-     ;;
107+ case  " $(  uname ) "   in                 # (
108+   CYGWIN*  )         cygwin=true  ;; # (
109+   Darwin*  )         darwin=true  ;; # (
110+   MSYS*  | MINGW*  )  msys=true    ;; # (
111+   NONSTOP*  )        nonstop=true ;;
81112esac 
82113
83114CLASSPATH=$APP_HOME /gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +118,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
87118if  [ -n  " $JAVA_HOME "   ] ;  then 
88119    if  [ -x  " $JAVA_HOME /jre/sh/java"   ] ;  then 
89120        #  IBM's JDK on AIX uses strange locations for the executables
90-         JAVACMD=" $JAVA_HOME /jre/sh/java" 
121+         JAVACMD=$JAVA_HOME /jre/sh/java
91122    else 
92-         JAVACMD=" $JAVA_HOME /bin/java" 
123+         JAVACMD=$JAVA_HOME /bin/java
93124    fi 
94125    if  [ !  -x  " $JAVACMD "   ] ;  then 
95126        die " ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 
@@ -98,88 +129,117 @@ Please set the JAVA_HOME variable in your environment to match the
98129location of your Java installation."  
99130    fi 
100131else 
101-     JAVACMD=" java" 
132+     JAVACMD=java
102133    which java > /dev/null 2>&1  ||  die " ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
103134
104135Please set the JAVA_HOME variable in your environment to match the 
105136location of your Java installation."  
106137fi 
107138
108139#  Increase the maximum file descriptors if we can.
109- if  [ " $cygwin "   =  " false"   -a  " $darwin "   =  " false"   -a  " $nonstop "   =  " false"   ] ;  then 
110-     MAX_FD_LIMIT=` ulimit -H -n` 
111-     if  [ $?  -eq  0 ] ;  then 
112-         if  [ " $MAX_FD "   =  " maximum"   -o  " $MAX_FD "   =  " max"   ] ;  then 
113-             MAX_FD=" $MAX_FD_LIMIT " 
114-         fi 
115-         ulimit  -n $MAX_FD 
116-         if  [ $?  -ne  0 ] ;  then 
117-             warn " Could not set maximum file descriptor limit: $MAX_FD " 
118-         fi 
119-     else 
120-         warn " Could not query maximum file descriptor limit: $MAX_FD_LIMIT " 
121-     fi 
140+ if  !  " $cygwin "   &&  !  " $darwin "   &&  !  " $nonstop "   ;  then 
141+     case  $MAX_FD  in  # (
142+       max* )
143+         #  In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
144+         #  shellcheck disable=SC3045
145+         MAX_FD=$(  ulimit  -H -n )   || 
146+             warn " Could not query maximum file descriptor limit" 
147+     esac 
148+     case  $MAX_FD  in   # (
149+       ' '   | soft) : ;; # (
150+       * )
151+         #  In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
152+         #  shellcheck disable=SC3045
153+         ulimit  -n " $MAX_FD "   || 
154+             warn " Could not set maximum file descriptor limit to $MAX_FD " 
155+     esac 
122156fi 
123157
124- #  For Darwin, add options to specify how the application appears in the dock
125- if  $darwin ;  then 
126-     GRADLE_OPTS=" $GRADLE_OPTS  \" -Xdock:name=$APP_NAME \"  \" -Xdock:icon=$APP_HOME /media/gradle.icns\" " 
127- fi 
158+ #  Collect all arguments for the java command, stacking in reverse order:
159+ #    * args from the command line
160+ #    * the main class name
161+ #    * -classpath
162+ #    * -D...appname settings
163+ #    * --module-path (only if needed)
164+ #    * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
128165
129166#  For Cygwin or MSYS, switch paths to Windows format before running java
130- if  [ " $cygwin "   =  " true"   -o  " $msys "   =  " true"   ] ;  then 
131-     APP_HOME=` cygpath --path --mixed " $APP_HOME " ` 
132-     CLASSPATH=` cygpath --path --mixed " $CLASSPATH " ` 
133- 
134-     JAVACMD=` cygpath --unix " $JAVACMD " ` 
135- 
136-     #  We build the pattern for arguments to be converted via cygpath
137-     ROOTDIRSRAW=` find -L / -maxdepth 1 -mindepth 1 -type d 2> /dev/null` 
138-     SEP=" " 
139-     for  dir  in  $ROOTDIRSRAW  ;  do 
140-         ROOTDIRS=" $ROOTDIRS$SEP$dir " 
141-         SEP=" |" 
142-     done 
143-     OURCYGPATTERN=" (^($ROOTDIRS ))" 
144-     #  Add a user-defined pattern to the cygpath arguments
145-     if  [ " $GRADLE_CYGPATTERN "   !=  " "   ] ;  then 
146-         OURCYGPATTERN=" $OURCYGPATTERN |($GRADLE_CYGPATTERN )" 
147-     fi 
167+ if  " $cygwin "   ||  " $msys "   ;  then 
168+     APP_HOME=$(  cygpath --path --mixed " $APP_HOME "   ) 
169+     CLASSPATH=$(  cygpath --path --mixed " $CLASSPATH "   ) 
170+ 
171+     JAVACMD=$(  cygpath --unix " $JAVACMD "   ) 
172+ 
148173    #  Now convert the arguments - kludge to limit ourselves to /bin/sh
149-     i=0
150-     for  arg  in  " $@ "   ;  do 
151-         CHECK=` echo " $arg " | egrep -c " $OURCYGPATTERN "   -` 
152-         CHECK2=` echo " $arg " | egrep -c " ^-" `                                   # ## Determine if an option
153- 
154-         if  [ $CHECK  -ne  0 ] &&  [ $CHECK2  -eq  0 ] ;  then                     # ## Added a condition
155-             eval  ` echo args$i `  =` cygpath --path --ignore --mixed " $arg " ` 
156-         else 
157-             eval  ` echo args$i `  =" \" $arg \" " 
174+     for  arg do 
175+         if 
176+             case  $arg  in                                 # (
177+               -* )   false  ;;                            #  don't mess with options #(
178+               /?* )  t=${arg#/ }  t=/${t%%/* }               #  looks like a POSIX filepath
179+                     [ -e  " $t "   ] ;;                      # (
180+               * )    false  ;;
181+             esac 
182+         then 
183+             arg=$(  cygpath --path --ignore --mixed " $arg "   ) 
158184        fi 
159-         i=` expr $i  + 1` 
185+         #  Roll the args list around exactly as many times as the number of
186+         #  args, so each arg winds up back in the position where it started, but
187+         #  possibly modified.
188+         # 
189+         #  NB: a `for` loop captures its iteration list before it begins, so
190+         #  changing the positional parameters here affects neither the number of
191+         #  iterations, nor the values presented in `arg`.
192+         shift                    #  remove old arg
193+         set  -- " $@ "   " $arg "        #  push replacement arg
160194    done 
161-     case  $i  in 
162-         0) set  -- ;;
163-         1) set  -- " $args0 "   ;;
164-         2) set  -- " $args0 "   " $args1 "   ;;
165-         3) set  -- " $args0 "   " $args1 "   " $args2 "   ;;
166-         4) set  -- " $args0 "   " $args1 "   " $args2 "   " $args3 "   ;;
167-         5) set  -- " $args0 "   " $args1 "   " $args2 "   " $args3 "   " $args4 "   ;;
168-         6) set  -- " $args0 "   " $args1 "   " $args2 "   " $args3 "   " $args4 "   " $args5 "   ;;
169-         7) set  -- " $args0 "   " $args1 "   " $args2 "   " $args3 "   " $args4 "   " $args5 "   " $args6 "   ;;
170-         8) set  -- " $args0 "   " $args1 "   " $args2 "   " $args3 "   " $args4 "   " $args5 "   " $args6 "   " $args7 "   ;;
171-         9) set  -- " $args0 "   " $args1 "   " $args2 "   " $args3 "   " $args4 "   " $args5 "   " $args6 "   " $args7 "   " $args8 "   ;;
172-     esac 
173195fi 
174196
175- #  Escape application args
176- save  () {
177-     for  i do  printf  %s\\ n " $i "   |  sed " s/'/'\\\\ ''/g;1s/^/'/;\$ s/\$ /' \\\\ /"   ;  done 
178-     echo  "  " 
179- }
180- APP_ARGS=` save " $@ " ` 
181197
182- #  Collect all arguments for the java command, following the shell quoting and substitution rules
183- eval  set  -- $DEFAULT_JVM_OPTS  $JAVA_OPTS  $GRADLE_OPTS  " \" -Dorg.gradle.appname=$APP_BASE_NAME \" "   -classpath " \" $CLASSPATH \" "   org.gradle.wrapper.GradleWrapperMain " $APP_ARGS " 
198+ #  Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
199+ DEFAULT_JVM_OPTS=' "-Xmx64m" "-Xms64m"' 
200+ 
201+ #  Collect all arguments for the java command;
202+ #    * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
203+ #      shell script including quotes and variable substitutions, so put them in
204+ #      double quotes to make sure that they get re-expanded; and
205+ #    * put everything else in single quotes, so that it's not re-expanded.
206+ 
207+ set  -- \
208+         " -Dorg.gradle.appname=$APP_BASE_NAME "   \
209+         -classpath " $CLASSPATH "   \
210+         org.gradle.wrapper.GradleWrapperMain \
211+         " $@ " 
212+ 
213+ #  Stop when "xargs" is not available.
214+ if  !  command  -v xargs > /dev/null 2>&1 
215+ then 
216+     die " xargs is not available" 
217+ fi 
218+ 
219+ #  Use "xargs" to parse quoted args.
220+ # 
221+ #  With -n1 it outputs one arg per line, with the quotes and backslashes removed.
222+ # 
223+ #  In Bash we could simply go:
224+ # 
225+ #    readarray ARGS < <( xargs -n1 <<<"$var" ) &&
226+ #    set -- "${ARGS[@]}" "$@"
227+ # 
228+ #  but POSIX shell has neither arrays nor command substitution, so instead we
229+ #  post-process each arg (as a line of input to sed) to backslash-escape any
230+ #  character that might be a shell metacharacter, then use eval to reverse
231+ #  that process (while maintaining the separation between arguments), and wrap
232+ #  the whole thing up as a single "set" statement.
233+ # 
234+ #  This will of course break if any of these variables contains a newline or
235+ #  an unmatched quote.
236+ # 
237+ 
238+ eval  " set -- $( 
239+         printf  ' %s\n'   " $DEFAULT_JVM_OPTS  $JAVA_OPTS  $GRADLE_OPTS "   |  
240+         xargs -n1 |  
241+         sed '  s~[^-[:alnum:]+,./:=@_]~\\&~g; '   |  
242+         tr ' \n'   '  '  
243+     )  "   ' "$@"' 
184244
185245exec  " $JAVACMD "   " $@ " 
0 commit comments