Как загрузить список диалога `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
5
задан 24 December 2010 в 13:38

2 ответа

Проблема в ls. Он никогда не был предназначен для использования в сценариях. Кроме того, бессмысленно использовать ls в скриптах, потому что оболочка может сделать работу намного лучше, просто используя глобус, см. http://mywiki.wooledge.org/BashGuide/Patterns [ 115]

zenlist="/tmp/zen list"; touch "$zenlist" "$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[@]}"
\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[@]}"
0
ответ дан 24 December 2010 в 13:38

Вы можете направить содержимое списка в 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"'
0
ответ дан 24 December 2010 в 13:38

Другие вопросы по тегам:

Похожие вопросы: