0 votes

Problèmes d'échappement des espaces dans les variables de type chaîne de caractères avec la commande grep et SU

MacOS Ventura ne nous permet apparemment plus de définir les éléments de l'application Dock par défaut à partir de la racine (la commande échoue silencieusement), de sorte que nous devons nous exécuter dans l'espace utilisateur à partir de notre script de MDM. Malheureusement, cela signifie que je dois enchaîner une commande grep avec SU, ce qui me pose toutes sortes de problèmes pour les éléments contenant des espaces :

zsh pour l'environnement, autre logique pour définir $current_user qui n'est pas pertinente supprimée.

    printf '%s%s%s%s%s' \
           '<dict><key>tile-data</key><dict><key>file-data</key><dict>' \
           '<key>_CFURLString</key><string>' \
           "$1" \
           '</string><key>_CFURLStringType</key><integer>0</integer>' \
           '</dict></dict></dict>'
}

for dockItem in {/Applications/{"Google Chrome","Slack","zoom.us"}.app,"Done"}; do
    echo $dockItem
    if [[ -e "$dockItem" ]]; then
        if ! [[ $dockItem == "Done" ]]; then
            # Does not actually work, nor does setting GREP_ARRAY=(-q "$dockItem") with grep "${GREP_ARRAY[@]}"
            # does not properly escape the path when executed "Chrome.app does not exist"
            EscapedPath=$( echo "$dockItem" | sed 's/ /\\ /g' )
            if (/usr/bin/su - "${current_user}" -c "defaults read com.apple.dock persistent-apps | /usr/bin/grep -q $EscapedPath"); then
                printf '%s\n' 'Dock icon already found.'
            else
                printf '%s\n' 'Setting up Dock icons...'
                /usr/bin/su - "${current_user}" -c "defaults write com.apple.dock persistent-apps -array-add '$(__dock_item $dockItem)'"
            fi
        fi
    else
        printf '%s\n' 'Restarting Dock...'
        killall Dock
    fi
done

Chaque fois qu'il tente de traiter "Google Chrome", la commande grep échoue et l'application est à nouveau épinglée au dock, ce qui crée un cycle sans fin d'ajout de copies de Chrome.

J'ai essayé plusieurs méthodes pour échapper $dockItem et le convertir en tableau, mais la chaîne complète n'est pas reconnue dans le shell zsh de Ventura.

if (/usr/bin/su - "${current_user}" -c "defaults read com.apple.dock persistent-apps | /usr/bin/grep -q '$dockItem'"); then

n'est pas non plus correctement échappé lorsqu'il est exécuté.

0voto

user1934428 Points 84

Puisque la seule raison pour laquelle vous manipulez l'espace blanc à l'intérieur de dockItem, c'est que votre utilisation de su -c implique l'évaluation de la chaîne de caractères, et donc la rupture de l'espace blanc, je ferais ici l'astuce suivante :

Lieu dockItem dans l'environnement :

export dockItem

Ensuite, il faut procéder à l'expansion des variables à l'intérieur du processus enfant créé par su et non dans le processus parent qui courses su :

if /usr/bin/su - $current_user -c 'defaults read com.apple.dock persistent-apps | /usr/bin/grep -q $dockItem'
then

Cela suppose que su fonctionne également en zsh (ce qui est vrai sur Mac, je suppose). Si ce n'est pas le cas, vous devez mettre la variable entre guillemets pour éviter les coupures de mots :

if /usr/bin/su - $current_user -c 'defaults read com.apple.dock persistent-apps | /usr/bin/grep -q "$dockItem"'
then

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X