"$@:2"? Perché non "$2"?

On Thu, Aug 29, 2019 at 5:06 PM 'Luigi R. Viggiano' [email protected]
[it-torino-java-jug] <[email protected]> wrote:

>
>
> 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]
>> <[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
>>>>>    <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
>>>> <https://www.linkedin.com/in/robfrank>
>>>>
>>>>
>>>
>>> --
>>> Paolo Mossino  <[email protected]>
>>>
>>> 
>


-- 
Paolo Mossino  <[email protected]>

Reply via email to