Je ne parviens pas à charger un dialogue de liste zenity
lorsque les données contiennent des espaces.
C’est simple quand il n’ya pas d’espace dans les données listées,
mais je ne connais pas de méthode simple/standard pour les noms de fichiers incorporés dans l’espace.
Pour une raison quelconque, la sortie de $ (ls -Q /tmp
) (sortie citée) reste
divise les noms de fichiers à chaque espace. Les guillemets et les barres obliques inversées dansls | sed
la sortie semble être traitée comme une "chaîne finalisée" plutôt que
en tant que "lignes de données lisibles" (comme les deux premières lignes de données) ...
J'ai réussi à "contourner le problème", mais le code d'auto-modification probablement
n'est pas la meilleure solution! (même si c'est amusant! :)
Voici la méthode qui ne fonctionne pas
zenlist="/tmp/zen list"; touch "$zenlist"
zenity --list --title='A single-column List' --width=600 --height=450 \
--column='Spaces are allowed within "q u o t e s"' \
"How much wood would a woodchuck chuck," \
"if a wooodchuck could chuck wood?" \
$(ls -Q -1 "$zenlist"* |sed 's/$/ \\/')
echo ""
# rm "$zenlist" # Uncomment this line to delete the file
Cette méthode fonctionne, mais il doit y avoir un "meilleur" moyen !?
zenlist="/tmp/zen list"
echo "zenity --list --title='A single-column List' --width=600 --height=450 \\" >"$zenlist"
echo "--column='Spaces are allowed within \"q u o t e s\"' \\" >>"$zenlist"
echo "\"How much wood would a woodchuck chuck,\" \\" >>"$zenlist"
echo "\"if a wooodchuck could chuck wood?\" \\" >>"$zenlist"
(ls -Q "$zenlist"* |sed 's/$/ \\/') >>"$zenlist"
echo "" >>"$zenlist"
source "$zenlist"
# rm "$zenlist" # Uncomment this line to delete the file
Le problème est ls
. Il n'a jamais été conçu pour être utilisé dans des scripts. En outre, il est également inutile d’utiliser ls
dans les scripts, car le shell peut faire beaucoup mieux le travail, en utilisant simplement un glob, voir http://mywiki.wooledge.org/BashGuide/Patterns
zenlist="/tmp/zen list"; touch "$zenlist" "$zenlist"$'\neven with a newline'
zenity --list --title='A single-column List' --width=600 --height=450 \
--column='Spaces are allowed within "q u o t e s"' \
"How much wood would a woodchuck chuck," \
"if a wooodchuck could chuck wood?" \
"$zenlist"*
Et pour un moyen général de mettre des éléments de liste avec des espaces et d’autres caractères dans une "variable", utilisez les tableaux bash.
# assign some items to start with
items=( "How much wood would a woodchuck chuck," "if a wooodchuck could chuck wood?" )
# append some items
items+=( "$zenlist"* )
zenity --list --title='A single-column List' --width=600 --height=450 \
--column='Spaces are allowed within "q u o t e s"' "${items[@]}"
Vous pouvez diriger le contenu de la liste vers zenity, comme
(echo "How much wood would a woodchuck chuck," ; \
echo "if a wooodchuck could chuck wood?" ; \
ls -Q -1 "$zenlist"* |sed 's/$/ \\/') \
| zenity --list --title='A single-column List' --width=600 --height=450 \
--column='Spaces are allowed within "q u o t e s"'