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.
1515#  See the License for the specific language governing permissions and
1616#  limitations under the License.
1717# 
18+ #  SPDX-License-Identifier: Apache-2.0
19+ # 
1820
1921# #############################################################################
20- # #
21- # #  Gradle start up script for UN*X
22- # #
22+ # 
23+ #    Gradle start up script for POSIX generated by Gradle.
24+ # 
25+ #    Important for running:
26+ # 
27+ #    (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
28+ #        noncompliant, but you have some other compliant shell such as ksh or
29+ #        bash, then to run this script, type that shell name before the whole
30+ #        command line, like:
31+ # 
32+ #            ksh Gradle
33+ # 
34+ #        Busybox and similar reduced shells will NOT work, because this script
35+ #        requires all of these POSIX shell features:
36+ #          * functions;
37+ #          * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
38+ #            «${var#prefix}», «${var%suffix}», and «$( cmd )»;
39+ #          * compound commands having a testable exit status, especially «case»;
40+ #          * various built-in commands including «command», «set», and «ulimit».
41+ # 
42+ #    Important for patching:
43+ # 
44+ #    (2) This script targets any POSIX shell, so it avoids extensions provided
45+ #        by Bash, Ksh, etc; in particular arrays are avoided.
46+ # 
47+ #        The "traditional" practice of packing multiple parameters into a
48+ #        space-separated string is a well documented source of bugs and security
49+ #        problems, so this is (mostly) avoided, by progressively accumulating
50+ #        options in "$@", and eventually passing that to Java.
51+ # 
52+ #        Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
53+ #        and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
54+ #        see the in-line comments for details.
55+ # 
56+ #        There are tweaks for specific operating systems such as AIX, CygWin,
57+ #        Darwin, MinGW, and NonStop.
58+ # 
59+ #    (3) This script is generated from the Groovy template
60+ #        https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
61+ #        within the Gradle project.
62+ # 
63+ #        You can find Gradle at https://github.com/gradle/gradle/.
64+ # 
2365# #############################################################################
2466
2567#  Attempt to set APP_HOME
68+ 
2669#  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 
70+ app_path=$0 
71+ 
72+ #  Need this for daisy-chained symlinks.
73+ while 
74+     APP_HOME=${app_path% " ${app_path##*/ } "    #  leaves a trailing /; empty if no leading path
75+     [ -h  " $app_path " 
76+ do 
77+     ls=$(  ls -ld " $app_path " ) 
78+     link=${ls#* '  -> '  
79+     case  $link  in              # (
80+       /* )   app_path=$link  ;; # (
81+       * )    app_path=$APP_HOME$link  ;;
82+     esac 
3783done 
38- SAVED=" ` pwd` " 
39- cd  " ` dirname \" $PRG \" ` " > /dev/null
40- APP_HOME=" ` pwd -P` " 
41- cd  " $SAVED " > /dev/null
4284
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" ' 
85+ #  This is normally unused 
86+ #  shellcheck disable=SC2034 
87+ APP_BASE_NAME= ${0 ##*/ } 
88+ #  Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) 
89+ APP_HOME= $(   cd  -P  " ${APP_HOME :- . / } "   >  /dev/null  &&   printf   ' %s\n '   " $PWD "   )   ||   exit 
4890
4991#  Use the maximum available, or set MAX_FD != -1 to use that value.
50- MAX_FD=" maximum" 
92+ MAX_FD=maximum
5193
5294warn  () {
5395    echo  " $* " 
54- }
96+ }  >&2 
5597
5698die  () {
5799    echo 
58100    echo  " $* " 
59101    echo 
60102    exit  1
61- }
103+ }  >&2 
62104
63105#  OS specific support (must be 'true' or 'false').
64106cygwin=false
65107msys=false
66108darwin=false
67109nonstop=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-     ;;
110+ case  " $(  uname ) " in                 # (
111+   CYGWIN*  )         cygwin=true  ;; # (
112+   Darwin*  )         darwin=true  ;; # (
113+   MSYS*  | MINGW*  )  msys=true    ;; # (
114+   NONSTOP*  )        nonstop=true ;;
81115esac 
82116
83117CLASSPATH=$APP_HOME /gradle/wrapper/gradle-wrapper.jar
84118
119+ 
85120#  Determine the Java command to use to start the JVM.
86121if  [ -n  " $JAVA_HOME " ;  then 
87122    if  [ -x  " $JAVA_HOME /jre/sh/java" ;  then 
88123        #  IBM's JDK on AIX uses strange locations for the executables
89-         JAVACMD=" $JAVA_HOME /jre/sh/java" 
124+         JAVACMD=$JAVA_HOME /jre/sh/java
90125    else 
91-         JAVACMD=" $JAVA_HOME /bin/java" 
126+         JAVACMD=$JAVA_HOME /bin/java
92127    fi 
93128    if  [ !  -x  " $JAVACMD " ;  then 
94129        die " ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 
@@ -97,87 +132,120 @@ Please set the JAVA_HOME variable in your environment to match the
97132location of your Java installation."  
98133    fi 
99134else 
100-     JAVACMD=" java" 
101-     which java > /dev/null 2>&1  ||  die " ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
135+     JAVACMD=java
136+     if  !  command  -v java > /dev/null 2>&1 
137+     then 
138+         die " ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
102139
103140Please set the JAVA_HOME variable in your environment to match the 
104141location of your Java installation."  
142+     fi 
105143fi 
106144
107145#  Increase the maximum file descriptors if we can.
108- if  [ " $cygwin " =  " false" -a  " $darwin " =  " false" -a  " $nonstop " =  " false" ;  then 
109-     MAX_FD_LIMIT=` ulimit -H -n` 
110-     if  [ $?  -eq  0 ] ;  then 
111-         if  [ " $MAX_FD " =  " maximum" -o  " $MAX_FD " =  " max" ;  then 
112-             MAX_FD=" $MAX_FD_LIMIT " 
113-         fi 
114-         ulimit  -n $MAX_FD 
115-         if  [ $?  -ne  0 ] ;  then 
116-             warn " Could not set maximum file descriptor limit: $MAX_FD " 
117-         fi 
118-     else 
119-         warn " Could not query maximum file descriptor limit: $MAX_FD_LIMIT " 
120-     fi 
146+ if  !  " $cygwin " &&  !  " $darwin " &&  !  " $nonstop " ;  then 
147+     case  $MAX_FD  in  # (
148+       max* )
149+         #  In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
150+         #  shellcheck disable=SC2039,SC3045
151+         MAX_FD=$(  ulimit  -H -n ) || 
152+             warn " Could not query maximum file descriptor limit" 
153+     esac 
154+     case  $MAX_FD  in   # (
155+       ' ' : ;; # (
156+       * )
157+         #  In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
158+         #  shellcheck disable=SC2039,SC3045
159+         ulimit  -n " $MAX_FD " || 
160+             warn " Could not set maximum file descriptor limit to $MAX_FD " 
161+     esac 
121162fi 
122163
123- #  For Darwin, add options to specify how the application appears in the dock
124- if  $darwin ;  then 
125-     GRADLE_OPTS=" $GRADLE_OPTS  \" -Xdock:name=$APP_NAME \"  \" -Xdock:icon=$APP_HOME /media/gradle.icns\" " 
126- fi 
164+ #  Collect all arguments for the java command, stacking in reverse order:
165+ #    * args from the command line
166+ #    * the main class name
167+ #    * -classpath
168+ #    * -D...appname settings
169+ #    * --module-path (only if needed)
170+ #    * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
127171
128172#  For Cygwin or MSYS, switch paths to Windows format before running java
129- if  [ " $cygwin " =  " true" -o  " $msys " =  " true" ;  then 
130-     APP_HOME=` cygpath --path --mixed " $APP_HOME " ` 
131-     CLASSPATH=` cygpath --path --mixed " $CLASSPATH " ` 
132-     JAVACMD=` cygpath --unix " $JAVACMD " ` 
133- 
134-     #  We build the pattern for arguments to be converted via cygpath
135-     ROOTDIRSRAW=` find -L / -maxdepth 1 -mindepth 1 -type d 2> /dev/null` 
136-     SEP=" " 
137-     for  dir  in  $ROOTDIRSRAW  ;  do 
138-         ROOTDIRS=" $ROOTDIRS$SEP$dir " 
139-         SEP=" |" 
140-     done 
141-     OURCYGPATTERN=" (^($ROOTDIRS ))" 
142-     #  Add a user-defined pattern to the cygpath arguments
143-     if  [ " $GRADLE_CYGPATTERN " !=  " " ;  then 
144-         OURCYGPATTERN=" $OURCYGPATTERN |($GRADLE_CYGPATTERN )" 
145-     fi 
173+ if  " $cygwin " ||  " $msys " ;  then 
174+     APP_HOME=$(  cygpath --path --mixed " $APP_HOME " ) 
175+     CLASSPATH=$(  cygpath --path --mixed " $CLASSPATH " ) 
176+ 
177+     JAVACMD=$(  cygpath --unix " $JAVACMD " ) 
178+ 
146179    #  Now convert the arguments - kludge to limit ourselves to /bin/sh
147-     i=0
148-     for  arg  in  " $@ " ;  do 
149-         CHECK=` echo " $arg " | egrep -c " $OURCYGPATTERN " ` 
150-         CHECK2=` echo " $arg " | egrep -c " ^-" ` # ## Determine if an option
151- 
152-         if  [ $CHECK  -ne  0 ] &&  [ $CHECK2  -eq  0 ] ;  then                     # ## Added a condition
153-             eval  ` echo args$i ` ` cygpath --path --ignore --mixed " $arg " ` 
154-         else 
155-             eval  ` echo args$i ` " \" $arg \" " 
180+     for  arg do 
181+         if 
182+             case  $arg  in                                 # (
183+               -* )   false  ;;                            #  don't mess with options #(
184+               /?* )  t=${arg#/ }  t=/${t%%/* }               #  looks like a POSIX filepath
185+                     [ -e  " $t " # (
186+               * )    false  ;;
187+             esac 
188+         then 
189+             arg=$(  cygpath --path --ignore --mixed " $arg " ) 
156190        fi 
157-         i=` expr $i  + 1` 
191+         #  Roll the args list around exactly as many times as the number of
192+         #  args, so each arg winds up back in the position where it started, but
193+         #  possibly modified.
194+         # 
195+         #  NB: a `for` loop captures its iteration list before it begins, so
196+         #  changing the positional parameters here affects neither the number of
197+         #  iterations, nor the values presented in `arg`.
198+         shift                    #  remove old arg
199+         set  -- " $@ " " $arg " #  push replacement arg
158200    done 
159-     case  $i  in 
160-         0) set  -- ;;
161-         1) set  -- " $args0 " 
162-         2) set  -- " $args0 " " $args1 " 
163-         3) set  -- " $args0 " " $args1 " " $args2 " 
164-         4) set  -- " $args0 " " $args1 " " $args2 " " $args3 " 
165-         5) set  -- " $args0 " " $args1 " " $args2 " " $args3 " " $args4 " 
166-         6) set  -- " $args0 " " $args1 " " $args2 " " $args3 " " $args4 " " $args5 " 
167-         7) set  -- " $args0 " " $args1 " " $args2 " " $args3 " " $args4 " " $args5 " " $args6 " 
168-         8) set  -- " $args0 " " $args1 " " $args2 " " $args3 " " $args4 " " $args5 " " $args6 " " $args7 " 
169-         9) set  -- " $args0 " " $args1 " " $args2 " " $args3 " " $args4 " " $args5 " " $args6 " " $args7 " " $args8 " 
170-     esac 
171201fi 
172202
173- #  Escape application args
174- save  () {
175-     for  i do  printf  %s\\ n " $i " |  sed " s/'/'\\\\ ''/g;1s/^/'/;\$ s/\$ /' \\\\ /" ;  done 
176-     echo  "  " 
177- }
178- APP_ARGS=` save " $@ " ` 
179203
180- #  Collect all arguments for the java command, following the shell quoting and substitution rules
181- eval  set  -- $DEFAULT_JVM_OPTS  $JAVA_OPTS  $GRADLE_OPTS  " \" -Dorg.gradle.appname=$APP_BASE_NAME \" " " \" $CLASSPATH \" " " $APP_ARGS " 
204+ #  Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
205+ DEFAULT_JVM_OPTS=' "-Xmx64m" "-Xms64m"' 
206+ 
207+ #  Collect all arguments for the java command:
208+ #    * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
209+ #      and any embedded shellness will be escaped.
210+ #    * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
211+ #      treated as '${Hostname}' itself on the command line.
212+ 
213+ set  -- \
214+         " -Dorg.gradle.appname=$APP_BASE_NAME " 
215+         -classpath " $CLASSPATH " 
216+         org.gradle.wrapper.GradleWrapperMain \
217+         " $@ " 
218+ 
219+ #  Stop when "xargs" is not available.
220+ if  !  command  -v xargs > /dev/null 2>&1 
221+ then 
222+     die " xargs is not available" 
223+ fi 
224+ 
225+ #  Use "xargs" to parse quoted args.
226+ # 
227+ #  With -n1 it outputs one arg per line, with the quotes and backslashes removed.
228+ # 
229+ #  In Bash we could simply go:
230+ # 
231+ #    readarray ARGS < <( xargs -n1 <<<"$var" ) &&
232+ #    set -- "${ARGS[@]}" "$@"
233+ # 
234+ #  but POSIX shell has neither arrays nor command substitution, so instead we
235+ #  post-process each arg (as a line of input to sed) to backslash-escape any
236+ #  character that might be a shell metacharacter, then use eval to reverse
237+ #  that process (while maintaining the separation between arguments), and wrap
238+ #  the whole thing up as a single "set" statement.
239+ # 
240+ #  This will of course break if any of these variables contains a newline or
241+ #  an unmatched quote.
242+ # 
243+ 
244+ eval  " set -- $( 
245+         printf  ' %s\n' " $DEFAULT_JVM_OPTS  $JAVA_OPTS  $GRADLE_OPTS " |  
246+         xargs -n1 |  
247+         sed '  s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |  
248+         tr ' \n' '  '  
249+     )  " ' "$@"' 
182250
183251exec  " $JAVACMD " " $@ " 
0 commit comments