web-dev-qa-db-fra.com

Simple script Zenity - pour sélectionner l'icône?

J'essaie de créer un script graphique simple Zenity + Bash qui répertorie tous les thèmes d'icônes disponibles dans /usr/share/icons, puis laisse l'utilisateur sélectionner un et cliquez sur "OK" pour remplacer gtk-icon-theme-name="Humanity" dans ~/.gtkrc-2.0.mine dire le nom du thème qu'ils ont choisi à la place de l'humanité. Je fais cela pour fournir une méthode graphique de choix de votre thème d'icône sous Openbox, car il n'y a pas encore de programme grand public pour cela.

Voici ce que j'ai jusqu'à présent:

#!/bin/bash
ICONS=$(ls -I "*.*" /usr/share/icons); SELECTED=$(zenity --list --column=/usr/share/icons \ $ICONS); echo 'gtk-icon-theme-name="$SELECTED"' >~/.gtkrc-2.0.mine

Cela fonctionne, sauf que echo écrira réellement $SELECTED dans le fichier texte, au lieu de prendre l'argument et de le remplacer par le choix de l'utilisateur.

Merci d'avance à tous ceux qui peuvent m'aider à apprendre à le faire et aux bases de Zenity.

4
ovine

C'est simple. Si vous voulez que echo imprime la valeur de $SELECT, vous ne devez pas utiliser de guillemets simples ', faites des guillemets doubles ". Les suivants sont les significations de la citation et de la barre oblique inverse.

  • Le guillemet double ("quote") protège tout ce qui est placé entre deux guillemets, sauf $, ', " et \. Utilisez les touches guillemets doubles lorsque vous ne voulez que des variables et une substitution de commande.

    • Variable - Oui
    • Wildcards - Non
    • Substitution de commande - oui
  • Le guillemet simple ("guillemet") protège tout ce qui est compris entre deux guillemets simples. Il est utilisé pour désactiver la signification particulière de tous les caractères.

    • Variable - Non
    • Wildcards - Non
    • Substitution de commande - Non
  • Utilisez barre oblique inverse ('\') pour modifier la signification particulière des caractères ou pour ignorer des caractères spéciaux dans le texte, tels que des guillemets.

Ainsi, votre commande devrait être:

#!/bin/bash
ICONS=$(ls -I "*.*" /usr/share/icons); SELECTED=$(zenity --list --column=/usr/share/icons \ $ICONS); echo "gtk-icon-theme-name=\"$SELECTED\"" >~/.gtkrc-2.0.mine
3
Tung Tran

En plus de la réponse de @ TungTran , votre script demande quelques améliorations.

Cramming le script sur une seule ligne, il est difficile de lire/comprendre/déboguer. Ecrivez une commande par ligne:

#!/bin/bash
ICONS=$(ls -I "*.*" /usr/share/icons)
SELECTED=$(zenity --list --column=/usr/share/icons \ $ICONS)
echo "gtk-icon-theme-name=\"$SELECTED\"" >~/.gtkrc-2.0.mine

Une autre manière, parfois moins gênante, d’incorporer une variable dans une sortie texte consiste à utiliser printf:

printf 'gtk-icon-theme-name="%s"\n' "$SELECTED" >~/.gtkrc-2.0.mine
1
janos