Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
|
materiel:logicos:start [2026/08/22 00:05] vitally-u44 [1. Télécharger le script] |
materiel:logicos:start [2026/08/23 17:08] (Version actuelle) vitally-u44 [1. Télécharger le script] |
||
|---|---|---|---|
| Ligne 104: | Ligne 104: | ||
| ==== Logiciels de print ==== | ==== Logiciels de print ==== | ||
| - | |||
| ^ Nom (et lien vers la page de ce wiki) ^ Origine (lien projet) ^ Version ^ Type d'installation ^ | ^ Nom (et lien vers la page de ce wiki) ^ Origine (lien projet) ^ Version ^ Type d'installation ^ | ||
| - | | [[https://lesporteslogiques.net/wiki/materiel/imprimante_thermique_brother_ql-570|ql570]] | | | | | + | | <del>[[https://lesporteslogiques.net/wiki/materiel/imprimante_thermique_brother_ql-570|ql570]]</del> | | | retiré des postes — voir [[#desinstaller_l_ancienne_stickeuse_ql-570_des_op_xx|le nettoyage]] | |
| - | | Stickeuse QL570 | | | | | + | | [[materiel:logicos:guideql570|Stickeuse QL-570]] | [[https://github.com/lesporteslogiques/stickeuse|origine]] | v1.0 | ''install.sh'' (dépôt) | |
| + | [[materiel:logicos:guideql570|Guide d'utilisation de Stickeuse QL-570]] | ||
| - | [[materiel:logicos:guideql570|Guide d'utilisation de StickeuseQL570]] | + | Le lien vers la page matériel de l'imprimante : [[materiel:imprimante_thermique_brother_ql-570|Brother QL-570]]. |
| ==== Logiciels de vidéo / création vidéo ==== | ==== Logiciels de vidéo / création vidéo ==== | ||
| Ligne 326: | Ligne 326: | ||
| ==== 1. Télécharger le script ==== | ==== 1. Télécharger le script ==== | ||
| - | [[https://lesporteslogiques.net/wiki/_media/materiel/logicos/nettoyage_stickeuse.txt|nettoyage_stickeuse.txt]] | + | [[https://lesporteslogiques.net/wiki/_export/code/materiel/logicos/start?codeblock=6|nettoyage_stickeuse.txt]] |
| Le fichier arrive dans le dossier **Téléchargements**. | Le fichier arrive dans le dossier **Téléchargements**. | ||
| + | Le code du script est reproduit en bas de page, pour qui veut le lire avant de | ||
| + | l'exécuter. | ||
| ==== 2. Ouvrir un terminal ==== | ==== 2. Ouvrir un terminal ==== | ||
| Ligne 360: | Ligne 362: | ||
| <code bash> | <code bash> | ||
| - | bash nettoyage_stickeuse.sh -n | + | bash nettoyage_stickeuse.txt -n |
| </code> | </code> | ||
| - | Inventaire seul : **ne supprime rien**. Trois réponses possibles : | + | Inventaire seul : **ne supprime rien**. Deux cas : |
| - | * ''Aucune trace de l'ancienne Stickeuse sur ce poste.'' — déjà nettoyé, ou jamais concerné. S'arrêter ici. | + | * ''Aucune trace de l'ancienne Stickeuse sur ce poste.'' — le poste est propre. Ne pas lancer la commande suivante : vous pouvez taper ''exit'' pour refermer la session root, c'est terminé et vous fermez et rouvrez la session du poste et vous pouvez installer l'application à partir du dépot GitHub |
| - | * ''N élément(s) à supprimer :'' suivi de la liste — c'est ce qui partira à la commande suivante. | + | * ''N élément(s) à supprimer :'' suivi de la liste — c'est ce qui sera effacé. Poursuivre avec la commande suivante. |
| - | * ''brother_ql (pip) : présent — CONSERVÉ'' — la bibliothèque Python est partagée avec d'autres usages du poste, le script la laisse volontairement. Message informatif. | + | |
| + | La ligne ''brother_ql (pip) : présent — CONSERVÉ'' peut s'ajouter à l'un ou | ||
| + | l'autre : c'est une bibliothèque partagée avec d'autres usages du poste, que le | ||
| + | script laisse volontairement en place. Ne rien faire. | ||
| <code bash> | <code bash> | ||
| - | bash nettoyage_stickeuse.sh | + | bash nettoyage_stickeuse.txt |
| </code> | </code> | ||
| Ligne 380: | Ligne 385: | ||
| * ''Aucun reste. Poste OPxx propre.'' — nettoyage complet. | * ''Aucun reste. Poste OPxx propre.'' — nettoyage complet. | ||
| - | * ''Restes à examiner :'' suivi d'une liste — des fichiers subsistent hors des emplacements connus du script, qui ne les touche pas. Relever la liste et la signaler. | + | * ''Restes à examiner :'' suivi d'une liste — des fichiers dont le nom contient « stickeuse » ou « ql570 » existent ailleurs sur le disque. Le plus souvent, ce sont des documents personnels ou des fichiers en corbeille, sans rapport avec l'ancienne version : le script ne les touche pas, par prudence. Ce n'est pas bloquant. Taper ''exit'', l'installation de la nouvelle version peut se faire. |
| <code bash> | <code bash> | ||
| exit | exit | ||
| Ligne 402: | Ligne 406: | ||
| ==== Le script ==== | ==== Le script ==== | ||
| + | |||
| Auteurice : Vitally LUBIN — Les Portes Logiques, 2026. | Auteurice : Vitally LUBIN — Les Portes Logiques, 2026. | ||
| Licence : [[https://www.gnu.org/licenses/agpl-3.0.html|GNU Affero General Public | Licence : [[https://www.gnu.org/licenses/agpl-3.0.html|GNU Affero General Public | ||
| License v3 (AGPL-3.0)]], comme le reste du projet Stickeuse — et non la licence | License v3 (AGPL-3.0)]], comme le reste du projet Stickeuse — et non la licence | ||
| CC BY-SA du wiki (le pied de page réserve ce cas : //sauf mention contraire//). | CC BY-SA du wiki (le pied de page réserve ce cas : //sauf mention contraire//). | ||
| + | |||
| <accordion> | <accordion> | ||
| - | <panel title="nettoyage_stickeuse.sh (cliquer pour afficher le code)"> | + | <panel title="nettoyage_stickeuse.txt (cliquer pour afficher le code)"> |
| - | <file bash nettoyage_stickeuse.sh> | + | <file bash nettoyage_stickeuse.txt> |
| #!/usr/bin/env bash | #!/usr/bin/env bash | ||
| # | # | ||
| # ============================================================================ | # ============================================================================ | ||
| - | # nettoyage_stickeuse.sh — version 1.1 | + | # nettoyage_stickeuse.txt — version 1.1 |
| # | # | ||
| # Retire l'ANCIENNE Stickeuse QL-570 d'un poste OP (Les Portes Logiques). | # Retire l'ANCIENNE Stickeuse QL-570 d'un poste OP (Les Portes Logiques). | ||
| Ligne 431: | Ligne 435: | ||
| # UTILISATION RAPIDE | # UTILISATION RAPIDE | ||
| # su - | # su - | ||
| - | # bash nettoyage_stickeuse.sh -n # inventaire seul, ne supprime rien | + | # bash nettoyage_stickeuse.txt -n # inventaire seul, ne supprime rien |
| - | # bash nettoyage_stickeuse.sh # inventorie, montre, demande, supprime | + | # bash nettoyage_stickeuse.txt # inventorie, montre, demande, supprime |
| # | # | ||
| # OPTIONS | # OPTIONS | ||
| Ligne 450: | Ligne 454: | ||
| # Tout lanceur .desktop pointant vers elle est conservé et signalé. | # Tout lanceur .desktop pointant vers elle est conservé et signalé. | ||
| # | # | ||
| - | # Documentation complète : https://lesporteslogiques.net/wiki/materiel/logicos/start | + | # Documentation complète : |
| + | # https://lesporteslogiques.net/wiki/materiel/logicos/start | ||
| # ============================================================================ | # ============================================================================ | ||
| + | |||
| # set -u : une variable non définie devient une erreur au lieu d'un vide | # set -u : une variable non définie devient une erreur au lieu d'un vide | ||
| # silencieux. Sur un script qui fait des rm, c'est vital : « rm -rf | # silencieux. Sur un script qui fait des rm, c'est vital : « rm -rf | ||
| Ligne 461: | Ligne 466: | ||
| # et le signaler dans le journal.) | # et le signaler dans le journal.) | ||
| set -uo pipefail | set -uo pipefail | ||
| + | |||
| VERSION="1.1" | VERSION="1.1" | ||
| HOTE="$(hostname)" # sert à nommer le journal par poste | HOTE="$(hostname)" # sert à nommer le journal par poste | ||
| HORODATE="$(date +%Y%m%d-%H%M%S)" | HORODATE="$(date +%Y%m%d-%H%M%S)" | ||
| JOURNAL="$(pwd)/nettoyage_${HOTE}_${HORODATE}.log" | JOURNAL="$(pwd)/nettoyage_${HOTE}_${HORODATE}.log" | ||
| + | |||
| # Drapeaux, modifiés plus bas par les options de la ligne de commande | # Drapeaux, modifiés plus bas par les options de la ligne de commande | ||
| INVENTAIRE_SEUL=0 | INVENTAIRE_SEUL=0 | ||
| SANS_CONFIRMATION=0 | SANS_CONFIRMATION=0 | ||
| AVEC_PIP=0 | AVEC_PIP=0 | ||
| + | |||
| # Liste blanche : chemins de la NOUVELLE version, jamais supprimés. | # Liste blanche : chemins de la NOUVELLE version, jamais supprimés. | ||
| # Ajouter ici tout autre chemin à préserver. | # Ajouter ici tout autre chemin à préserver. | ||
| PROTEGES=("/opt/ql570") | PROTEGES=("/opt/ql570") | ||
| + | |||
| CIBLES=() # ce qui sera supprimé | CIBLES=() # ce qui sera supprimé | ||
| SIGNALES=() # ce qui est conservé volontairement, mais mérite d'être dit | SIGNALES=() # ce qui est conservé volontairement, mais mérite d'être dit | ||
| + | |||
| # ---------------------------------------------------------------- utilitaires | # ---------------------------------------------------------------- utilitaires | ||
| + | |||
| # Tout ce qui s'affiche part aussi dans le journal : « tee -a » écrit sur la | # Tout ce qui s'affiche part aussi dans le journal : « tee -a » écrit sur la | ||
| # sortie standard ET ajoute au fichier. Sur 30 postes, le journal est la seule | # sortie standard ET ajoute au fichier. Sur 30 postes, le journal est la seule | ||
| Ligne 486: | Ligne 491: | ||
| msg() { printf '%s\n' "$*" | tee -a "$JOURNAL"; } | msg() { printf '%s\n' "$*" | tee -a "$JOURNAL"; } | ||
| titre() { printf '\n=== %s ===\n' "$*" | tee -a "$JOURNAL"; } | titre() { printf '\n=== %s ===\n' "$*" | tee -a "$JOURNAL"; } | ||
| + | |||
| # Le chemin appartient-il à la nouvelle version ? | # Le chemin appartient-il à la nouvelle version ? | ||
| # Le motif "$p"/* attrape aussi tout ce qui est DANS un dossier protégé. | # Le motif "$p"/* attrape aussi tout ce qui est DANS un dossier protégé. | ||
| Ligne 496: | Ligne 501: | ||
| return 1 | return 1 | ||
| } | } | ||
| + | |||
| # Ajoute un chemin à la liste de suppression, avec trois filtres : | # Ajoute un chemin à la liste de suppression, avec trois filtres : | ||
| # 1. chemin vide -> ignoré (protection anti-« rm -rf » sur rien) | # 1. chemin vide -> ignoré (protection anti-« rm -rf » sur rien) | ||
| Ligne 515: | Ligne 520: | ||
| CIBLES+=("$chemin") | CIBLES+=("$chemin") | ||
| } | } | ||
| + | |||
| signaler() { SIGNALES+=("$1"); } | signaler() { SIGNALES+=("$1"); } | ||
| + | |||
| # L'aide est l'en-tête du fichier lui-même : une seule source, jamais de | # L'aide est l'en-tête du fichier lui-même : une seule source, jamais de | ||
| # décalage entre la doc et le code. | # décalage entre la doc et le code. | ||
| - | aide() { sed -n '4,38p' "$0" | sed 's/^# \{0,1\}//'; exit 0; } | + | aide() { sed -n '4,41p' "$0" | sed 's/^# \{0,1\}//'; exit 0; } |
| + | |||
| # ------------------------------------------------------------------ arguments | # ------------------------------------------------------------------ arguments | ||
| + | |||
| while [[ $# -gt 0 ]]; do | while [[ $# -gt 0 ]]; do | ||
| case "$1" in | case "$1" in | ||
| Ligne 534: | Ligne 539: | ||
| shift | shift | ||
| done | done | ||
| + | |||
| # EUID = identifiant effectif de l'utilisateur ; 0 = root. | # EUID = identifiant effectif de l'utilisateur ; 0 = root. | ||
| # Nécessaire pour /opt et /etc, et pour parcourir tous les /home. | # Nécessaire pour /opt et /etc, et pour parcourir tous les /home. | ||
| Ligne 541: | Ligne 546: | ||
| exit 1 | exit 1 | ||
| fi | fi | ||
| - | + | ||
| - | msg "nettoyage_stickeuse.sh v${VERSION} — poste ${HOTE} — ${HORODATE}" | + | msg "nettoyage_stickeuse.txt v${VERSION} — poste ${HOTE} — ${HORODATE}" |
| msg "Journal : ${JOURNAL}" | msg "Journal : ${JOURNAL}" | ||
| + | |||
| # ============================================================== 1. INVENTAIRE | # ============================================================== 1. INVENTAIRE | ||
| # Rien n'est supprimé ici : on ne fait que remplir CIBLES et SIGNALES. | # Rien n'est supprimé ici : on ne fait que remplir CIBLES et SIGNALES. | ||
| + | |||
| titre "1. Inventaire" | titre "1. Inventaire" | ||
| + | |||
| # --- côté système ----------------------------------------------------------- | # --- côté système ----------------------------------------------------------- | ||
| ajouter "/opt/stickeuse_ql570" # dossier de l'ancienne version | ajouter "/opt/stickeuse_ql570" # dossier de l'ancienne version | ||
| ajouter "/usr/local/bin/ql570" # binaire C compilé de l'ancienne version | ajouter "/usr/local/bin/ql570" # binaire C compilé de l'ancienne version | ||
| + | |||
| # Lanceurs du menu général. C'est ici que se joue la distinction ancienne / | # Lanceurs du menu général. C'est ici que se joue la distinction ancienne / | ||
| # nouvelle : la ligne « Exec= » du fichier .desktop dit quel programme est | # nouvelle : la ligne « Exec= » du fichier .desktop dit quel programme est | ||
| Ligne 565: | Ligne 570: | ||
| fi | fi | ||
| done | done | ||
| + | |||
| # Règles udev : elles donnent à l'utilisateur le droit de parler à | # Règles udev : elles donnent à l'utilisateur le droit de parler à | ||
| # l'imprimante USB. Absentes sur OP60, présentes sur OP42. | # l'imprimante USB. Absentes sur OP60, présentes sur OP42. | ||
| Ligne 571: | Ligne 576: | ||
| [[ -e "$f" ]] && ajouter "$f" | [[ -e "$f" ]] && ajouter "$f" | ||
| done | done | ||
| + | |||
| # --- côté utilisateurs ------------------------------------------------------ | # --- côté utilisateurs ------------------------------------------------------ | ||
| # On balaie /home/* plutôt que d'écrire un nom de compte en dur : il vaut | # On balaie /home/* plutôt que d'écrire un nom de compte en dur : il vaut | ||
| Ligne 578: | Ligne 583: | ||
| for maison in /home/*; do | for maison in /home/*; do | ||
| [[ -d "$maison" ]] || continue | [[ -d "$maison" ]] || continue | ||
| + | |||
| ajouter "$maison/bin/stickeuse_ql570" # dossier de travail (OP60) | ajouter "$maison/bin/stickeuse_ql570" # dossier de travail (OP60) | ||
| ajouter "$maison/.gitdl/ql570" # sources téléchargées (OP60) | ajouter "$maison/.gitdl/ql570" # sources téléchargées (OP60) | ||
| ajouter "$maison/.ql570" # journal d'impression de l'appli | ajouter "$maison/.ql570" # journal d'impression de l'appli | ||
| + | |||
| # Recherche par motif dans les dossiers de configuration. | # Recherche par motif dans les dossiers de configuration. | ||
| # -maxdepth 1 : on ne descend pas dans les sous-dossiers, pour ne pas | # -maxdepth 1 : on ne descend pas dans les sous-dossiers, pour ne pas | ||
| Ligne 595: | Ligne 600: | ||
| done < <(find "$d" -maxdepth 1 \( -iname '*stickeuse*' -o -iname '*ql570*' \) 2>/dev/null) | done < <(find "$d" -maxdepth 1 \( -iname '*stickeuse*' -o -iname '*ql570*' \) 2>/dev/null) | ||
| done | done | ||
| + | |||
| # Lanceurs personnels : menu utilisateur, Bureau (session en français) et | # Lanceurs personnels : menu utilisateur, Bureau (session en français) et | ||
| # Desktop (session en anglais). Même test Exec= que plus haut. | # Desktop (session en anglais). Même test Exec= que plus haut. | ||
| Ligne 609: | Ligne 614: | ||
| done | done | ||
| done | done | ||
| + | |||
| # --- bibliothèque Python brother_ql ----------------------------------------- | # --- bibliothèque Python brother_ql ----------------------------------------- | ||
| # Installée par pip en root dans /usr/local, donc partagée par tout le poste. | # Installée par pip en root dans /usr/local, donc partagée par tout le poste. | ||
| Ligne 619: | Ligne 624: | ||
| PIP_PRESENT=1 | PIP_PRESENT=1 | ||
| fi | fi | ||
| + | |||
| # --- restitution de l'inventaire -------------------------------------------- | # --- restitution de l'inventaire -------------------------------------------- | ||
| if [[ ${#CIBLES[@]} -eq 0 ]]; then | if [[ ${#CIBLES[@]} -eq 0 ]]; then | ||
| Ligne 627: | Ligne 632: | ||
| for c in "${CIBLES[@]}"; do msg " - $c"; done | for c in "${CIBLES[@]}"; do msg " - $c"; done | ||
| fi | fi | ||
| + | |||
| if [[ ${#SIGNALES[@]} -gt 0 ]]; then | if [[ ${#SIGNALES[@]} -gt 0 ]]; then | ||
| msg "" | msg "" | ||
| Ligne 633: | Ligne 638: | ||
| for s in "${SIGNALES[@]}"; do msg " ! $s"; done | for s in "${SIGNALES[@]}"; do msg " ! $s"; done | ||
| fi | fi | ||
| + | |||
| if [[ $PIP_PRESENT -eq 1 ]]; then | if [[ $PIP_PRESENT -eq 1 ]]; then | ||
| msg "" | msg "" | ||
| Ligne 642: | Ligne 647: | ||
| fi | fi | ||
| fi | fi | ||
| + | |||
| if [[ $INVENTAIRE_SEUL -eq 1 ]]; then | if [[ $INVENTAIRE_SEUL -eq 1 ]]; then | ||
| msg "" | msg "" | ||
| Ligne 648: | Ligne 653: | ||
| exit 0 | exit 0 | ||
| fi | fi | ||
| + | |||
| # Poste déjà propre : on s'arrête là. | # Poste déjà propre : on s'arrête là. | ||
| [[ ${#CIBLES[@]} -eq 0 && $PIP_PRESENT -eq 0 ]] && exit 0 | [[ ${#CIBLES[@]} -eq 0 && $PIP_PRESENT -eq 0 ]] && exit 0 | ||
| + | |||
| # ============================================================ 2. CONFIRMATION | # ============================================================ 2. CONFIRMATION | ||
| + | |||
| if [[ $SANS_CONFIRMATION -eq 0 ]]; then | if [[ $SANS_CONFIRMATION -eq 0 ]]; then | ||
| printf '\nSupprimer les éléments ci-dessus ? [o/N] ' | printf '\nSupprimer les éléments ci-dessus ? [o/N] ' | ||
| Ligne 663: | Ligne 668: | ||
| esac | esac | ||
| fi | fi | ||
| + | |||
| # ============================================================= 3. SUPPRESSION | # ============================================================= 3. SUPPRESSION | ||
| + | |||
| titre "2. Suppression" | titre "2. Suppression" | ||
| + | |||
| UDEV_TOUCHE=0 | UDEV_TOUCHE=0 | ||
| for c in ${CIBLES[@]+"${CIBLES[@]}"}; do | for c in ${CIBLES[@]+"${CIBLES[@]}"}; do | ||
| Ligne 681: | Ligne 686: | ||
| fi | fi | ||
| done | done | ||
| + | |||
| # Sans rechargement, une règle supprimée reste active jusqu'au redémarrage. | # Sans rechargement, une règle supprimée reste active jusqu'au redémarrage. | ||
| if [[ $UDEV_TOUCHE -eq 1 ]]; then | if [[ $UDEV_TOUCHE -eq 1 ]]; then | ||
| udevadm control --reload-rules 2>/dev/null && msg " règles udev rechargées" | udevadm control --reload-rules 2>/dev/null && msg " règles udev rechargées" | ||
| fi | fi | ||
| + | |||
| # Debian 13 refuse pip en root sans --break-system-packages (PEP 668). | # Debian 13 refuse pip en root sans --break-system-packages (PEP 668). | ||
| # Sans risque ici : ces fichiers vivent dans /usr/local, hors du Python géré | # Sans risque ici : ces fichiers vivent dans /usr/local, hors du Python géré | ||
| Ligne 695: | Ligne 700: | ||
| || pip3 uninstall -y brother_ql 2>&1 | tee -a "$JOURNAL" | || pip3 uninstall -y brother_ql 2>&1 | tee -a "$JOURNAL" | ||
| fi | fi | ||
| + | |||
| # Le menu lit un cache : sans ce rafraîchissement, l'entrée reste affichée | # Le menu lit un cache : sans ce rafraîchissement, l'entrée reste affichée | ||
| # alors que le fichier a disparu (clic sans effet). | # alors que le fichier a disparu (clic sans effet). | ||
| Ligne 706: | Ligne 711: | ||
| msg " menus rafraîchis" | msg " menus rafraîchis" | ||
| fi | fi | ||
| + | |||
| # ============================================================ 4. VERIFICATION | # ============================================================ 4. VERIFICATION | ||
| # On relance la recherche à blanc sur tout le disque pour confirmer. | # On relance la recherche à blanc sur tout le disque pour confirmer. | ||
| + | |||
| titre "3. Vérification" | titre "3. Vérification" | ||
| + | |||
| # -xdev : ne franchit pas les frontières de systèmes de fichiers. Évite de | # -xdev : ne franchit pas les frontières de systèmes de fichiers. Évite de | ||
| # partir dans /proc et /sys. Si /home est sur une autre partition, il faut | # partir dans /proc et /sys. Si /home est sur une autre partition, il faut | ||
| - | # relancer la recherche dessus (voir README, section « Limites »). | + | # relancer la recherche dessus (voir le wiki, section « Limites connues »). |
| # | # | ||
| # On écarte de la liste des « restes » : la nouvelle version, ce qui a été | # On écarte de la liste des « restes » : la nouvelle version, ce qui a été | ||
| Ligne 725: | Ligne 730: | ||
| | grep -Fv "$(basename "$MOI")" \ | | grep -Fv "$(basename "$MOI")" \ | ||
| | grep -Fxv "$JOURNAL" || true)" | | grep -Fxv "$JOURNAL" || true)" | ||
| + | |||
| for s in ${SIGNALES[@]+"${SIGNALES[@]}"}; do | for s in ${SIGNALES[@]+"${SIGNALES[@]}"}; do | ||
| chemin="${s%% (*}" # retire le commentaire entre parenthèses | chemin="${s%% (*}" # retire le commentaire entre parenthèses | ||
| RESTES="$(printf '%s\n' "$RESTES" | grep -Fxv "$chemin" || true)" | RESTES="$(printf '%s\n' "$RESTES" | grep -Fxv "$chemin" || true)" | ||
| done | done | ||
| + | |||
| if [[ -z "$RESTES" ]]; then | if [[ -z "$RESTES" ]]; then | ||
| msg "Aucun reste. Poste ${HOTE} propre." | msg "Aucun reste. Poste ${HOTE} propre." | ||
| Ligne 737: | Ligne 742: | ||
| printf '%s\n' "$RESTES" | tee -a "$JOURNAL" | printf '%s\n' "$RESTES" | tee -a "$JOURNAL" | ||
| fi | fi | ||
| + | |||
| if command -v brother_ql >/dev/null 2>&1; then | if command -v brother_ql >/dev/null 2>&1; then | ||
| msg "brother_ql (pip) toujours en place (conservé volontairement, ou --avec-pip non passé)." | msg "brother_ql (pip) toujours en place (conservé volontairement, ou --avec-pip non passé)." | ||
| fi | fi | ||
| + | |||
| msg "" | msg "" | ||
| msg "Terminé. Fermer et rouvrir la session pour rafraîchir l'affichage du menu." | msg "Terminé. Fermer et rouvrir la session pour rafraîchir l'affichage du menu." | ||
| Ligne 748: | Ligne 753: | ||
| </panel> | </panel> | ||
| </accordion> | </accordion> | ||
| + | |||