• # 3è point

    Posté par (site web personnel, Mastodon) . En réponse au message Shell Parameter Expansion. Évalué à 3. Dernière modification le 20 mars 2024 à 13:15.

    C'est vraisemblablement pas une commande bien que avec mon zsh configuré pour que le mot passe en vert si la commande existe (même principe que avec fish); ":" est en vert.
    Par contre man : ou : -h --help ne fonctionne pas :)

    Il s’agit d’une commande interne, et seule les commandes externes ont une page dédiée (dit comme ça, ça peut surprendre mais POSIX demande que certaines commandes internes soient disponibles en externe aussi, cas de true et test par exemple.) Avec Bash par exemple tu pourrais avoir...

    $ help :
    :: :
     No effect; the command does nothing. A zero exit code is returned.

    ...sinon faut passer par man $(basename $SHELL) puis rechercher dans la page :)
    Édition : C’est aussi listé dans man builtins où on indique aussi ce qui doit exister aussi en commande externe et la compatibilité avec csh.

    Il s’agit d’une commande historique (i.e. les premiers shell Bourne) bien avant l’apparition des commandes true et false, ce qui fait qu’on les retrouve dans certaines constructions de dinosaures...

    if ma_commande; then :; else echo "échec"; fi

    ...où on pourrait utiliser les nouvelles commandes plus lisibles.

    if ! ma_commande; then echo "échec"; fi

    C’est encore utile dans certains rares cas comme l’exemple que tu cites, ou les blocs de commentaires (dans le shell on ne sait normalement faire que des commentaires avec le croisillon, mais voici)

    : << 'SKIP'
    bloc de code inactif
    SKIP

    Du coup, pour en revenir à l’exemple initial, c’est une erreur si on n’indique pas une affectation ou une commande à exécuter (c’est OK si ta variable après évaluation donne une commande...)

    $ echo $SHELL
    /bin/bash
    $ $SHELL -c pwd
    /home/me
    $ $HOME
    -bash: /home/me: is a directory

    Et dans le cas présent, le "no-op" remplace la commande (j’utilise echo à la place en phase de débogage) et on n’a donc pas d’erreur.

    : ${vartest:=DEFAULT}

    se traduirait (façon plus moderne, donc moins dinosaure/exotérique)

    if [ -z "$vartest" ]
    then
     vartest="DEFAULT"
    fi

    ...ou encore simplement

    vartest=${vartest:=DEFAULT}

    "It is seldom that liberty of any kind is lost all at once." ― David Hume