Как загрузить список диалога `zenity` со встроенными в пробел данными из`ls`?
У меня проблемы с загрузкой zenity
Диалог списка, когда данные содержат пробелы.
Это просто, когда в перечисленных данных нет пробелов,
но я не знаю простого / стандартного метода для встроенных в пространство имен файлов.
По какой-то причине вывод $ (ls -Q /tmp
) (Цитируемый выход) еще
разбивает имена файлов в каждом месте Цитаты и косые черты вls | sed
кажется, что вывод обрабатывается как "завершенная строка", а не как
как "читаемые строки данных" (как первые две строки данных)...
Мне удалось "обойти эту проблему", но, вероятно, самоизменяющийся код
не лучший способ пойти! (хотя это весело!:)
Вот метод, который НЕ работает
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
Этот метод работает, но должен быть "обычный" (лучший) способ!?
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
2 ответа
Проблема в ls
, Он никогда не был предназначен для использования в сценариях. Кроме того, это также бессмысленно использовать ls
в сценариях, поскольку оболочка может выполнять работу намного лучше, просто используя глобус, см. 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"*
А для общего способа помещения элементов списка с пробелами и другими символами в "переменную" используйте массивы 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[@]}"
Вы можете направить содержимое списка в zenity, например
(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"'