0 votos

Problemas de escape de espacios en la variable de cadena con el comando grep y SU

Al parecer, MacOS Ventura ya no nos permite configurar los elementos de la aplicación del Dock por defecto desde Root (el comando falla silenciosamente), por lo que estamos teniendo que ejecutar en el espacio del usuario desde nuestro MDM script. Por desgracia, esto significa que tengo que encadenar un comando grep con SU que me está causando todo tipo de problemas para los elementos que tienen espacios:

zsh para el entorno, otra lógica para establecer $current_user que no es relevante eliminada.

    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

Cada vez que intenta procesar "Google Chrome", el comando grep falla y la aplicación se ancla al dock de nuevo, creando un ciclo interminable de copias de Chrome que se añaden.

He probado varios métodos para escapar $dockItem, y convertirlo en un array, pero no reconoce la cadena completa en el shell zsh de Ventura.

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

Tampoco se escapa correctamente cuando se ejecuta.

1voto

user1934428 Puntos 113

Ya que la única razón por la que se juega con el espacio en blanco dentro de dockItem, es que su uso de su -c implica la evaluación de la cadena, rompiendo así en el espacio en blanco, yo haría aquí el siguiente truco de pulgar:

Lugar dockItem en el medio ambiente:

export dockItem

A continuación, realice cualquier expansión de variables dentro del proceso hijo creado por su en lugar de en el proceso principal que corre su :

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

Esto supone que su también ejecuta un zsh (que supongo que es cierto en el Mac). Si no es el caso tienes que citar la variable para evitar la división de palabras:

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X