Ho provato con a sostituire $* con $@ e non va.

$ cat __java

REQ_VERSION="$1"

shift

JVM_PREFIX_PATH="/Library/Java/JavaVirtualMachines"

JVM_SUFFIX_PATH="/Contents/Home"


_latest() {

    local WHERE="$1"

    find "${WHERE}" -maxdepth 1 -type d 2> /dev/null | grep "${@:2}" | sort
-r | head -1

}


_readlink() {

    if [[ -L $1 ]]; then

        stat -f "%Y" "$1"

    else

        stat -f "%N" "$1"

    fi

}


# environment settings

JDK_PATH="$(_latest `_readlink $JVM_PREFIX_PATH` $REQ_VERSION)"

if [[ -n "$JDK_PATH" ]]; then

    export JAVA_HOME="$JDK_PATH$JVM_SUFFIX_PATH"

    export PATH=$JAVA_HOME/bin:$PATH

    export MANPATH=$JAVA_HOME/man:$MANPATH

else

    echo JDK matching version \"$REQ_VERSION\" cannot be found. >&2

    exit 1

fi


unset -f _latest _readlink


if [[ -n "$VERBOSE" ]]; then

    echo JAVA_HOME=$JAVA_HOME

    echo

    java -version

    echo

fi


# execute the command line

if [ -n "${@}" ]; then

    ${@}

fi


$ java8 ls -la

/Users/work/var/src/dotfiles/bin/__java: line 40: [: ls: binary operator
expected


$ cat __java

REQ_VERSION="$1"

shift

JVM_PREFIX_PATH="/Library/Java/JavaVirtualMachines"

JVM_SUFFIX_PATH="/Contents/Home"


_latest() {

    local WHERE="$1"

    find "${WHERE}" -maxdepth 1 -type d 2> /dev/null | grep "${@:2}" | sort
-r | head -1

}


_readlink() {

    if [[ -L $1 ]]; then

        stat -f "%Y" "$1"

    else

        stat -f "%N" "$1"

    fi

}


# environment settings

JDK_PATH="$(_latest `_readlink $JVM_PREFIX_PATH` $REQ_VERSION)"

if [[ -n "$JDK_PATH" ]]; then

    export JAVA_HOME="$JDK_PATH$JVM_SUFFIX_PATH"

    export PATH=$JAVA_HOME/bin:$PATH

    export MANPATH=$JAVA_HOME/man:$MANPATH

else

    echo JDK matching version \"$REQ_VERSION\" cannot be found. >&2

    exit 1

fi


unset -f _latest _readlink


if [[ -n "$VERBOSE" ]]; then

    echo JAVA_HOME=$JAVA_HOME

    echo

    java -version

    echo

fi


# execute the command line

if [ -n "${*}" ]; then

    ${*}

fi


$ java8 ls -la

total 264

drwxr-xr-x  35 lvig0001  admin  1120 Aug 29 17:02 .

drwxr-xr-x  10 lvig0001  admin   320 Feb  6  2019 ..

-rw-r--r--   1 lvig0001  admin   870 Aug 29 17:02 __java

-rw-r--r--   1 lvig0001  admin   865 Nov  6  2018 __ssh_server_functions

-rwxr-xr-x   1 lvig0001  admin   103 Nov  6  2018 airport

-rwxr-xr-x   1 lvig0001  admin    82 Nov  6  2018 backup-music




Da notare che nella funzione _latest() ho usato ${@:2}.

Probabilmente è uno di quei casi dove bisogna usare ${*}

Adesso non mi ricordo perché è così, ma probabile che ci sono inciampato
già su questa cosa.

Per cui non è un bug, è una feature ;)

Ciao
--Luigi



On Thu, Aug 29, 2019 at 4:51 PM Luigi R. Viggiano <[email protected]>
wrote:

> Effettivamente è un bug. Ma non essendomene mai accorto.... ;)
>
> Ci sono una serie di quirk di bash di cui sono al corrente (tipo la
> differenza tra "[" e "[[") o gli apici singoli e doppi, e anche $* e $@.
> Prendo nota come best practice di usare "$@".
>
> Lo correggo quando arrivo a casa. ;)
>
> Grazie.
> --Luigi
>
>
>
> On Wed, May 8, 2019 at 10:59 PM Paolo Mossino [email protected]
> [it-torino-java-jug] <[email protected]> wrote:
>
>>
>>
>> Concorderei, MA:
>>
>>    - stiamo parlando di un dotfiles, quindi mi aspetto sia l'autore a
>>    considerare e decidere cosa farci, visto che è teoricamente a suo uso e
>>    consumo semi-esclusivo ;-)
>>    - è possibile che A) funzioni per via compensazioni altrove (tipo
>>    doppio bug che si annullano a vicenda) o B) l'autore faccia leva su questo
>>    comportamento per fare magie, quindi risolverlo potrebbe impattare
>>    dipendenze esterne di cui non sono a conoscenza
>>
>> Parliamo di Java, ecco un esempio di magie che funzionicchiano sfruttando
>> il fatto che *NON* hai quotato correttamente le variabili (e quindi
>> chiedi alla bash di fare un parsing al volo):
>>
>> OPTS="-Dfoo=bar -Daaa=bbb"
>> java ${OPTS} "$@"
>>
>>
>> La versione corretto richiede di usare un array bash (se la version di
>> Bash lo supporta):
>>
>> declare -a OPTS=(
>>     '-DDfoo=bar'
>>     '-Daaa=bbb'
>> )
>>
>> java "${OPTS[@]}" "$@"
>>
>>
>> .... ma questo non funziona bene se OPTS veniva dall'environment (che
>> AFAICR non supporta gli array, solo stringhe) anziché da un file sourced.
>>
>> Un *buon* esempio di come fare uno startup di un programma Java
>> correttamente l'ho trovato in jetty.sh... good job! ;-)
>>
>>
>>
>> On Wed, May 8, 2019 at 3:38 PM Roberto Franchini [email protected]
>> [it-torino-java-jug] <[email protected]> wrote:
>>
>>>
>>>
>>>
>>>
>>> On Wed, May 8, 2019 at 3:33 PM Paolo Mossino [email protected]
>>> [it-torino-java-jug] <[email protected]> wrote:
>>>
>>>>
>>>>
>>>>  [cut]
>>>
>>>
>>>
>>>> L'errore appare nei vari wrapper, tipo
>>>>
>>>>    - https://github.com/lviggiano/dotfiles/blob/master/bin/java10#L2
>>>>    - https://github.com/lviggiano/dotfiles/blob/master/bin/__java#L41
>>>>
>>>>
>>>>
>>> PR subito!!!!!
>>> That's the way!
>>>
>>> FRANK
>>> --
>>> Roberto Franchini
>>> "The impossible is inevitable"
>>> https://github.com/robfrank/
>>> https://twitter.com/robfrankie
>>> https://www.linkedin.com/in/robfrank
>>>
>>>
>>
>> --
>> Paolo Mossino  <[email protected]>
>>
>> 
>>
>

Reply via email to