Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Как правильно скормить zenity сгенерированный параметр? (bash)  (Прочитано 2936 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
Пробелы, переносы... как у баша с этим через все запутано!

Задача, стало быть, такая.
Скрипт читает (ls) список файлов в каталоге, грепает и выводит в диалоговое графическое окно zenity (с чекбоксами).
Я расставляю мышою галки, жму «одобрямс» и скрипт дальше переваривает отобранное файло по алгоритму.

Чтобы вам репу не чесать, очень простой и понятный ликбез про zenity от Межделмаша, см. конкретно листинг 6.

И вот, например, отфильтровываем жыпеги:
found_img=$(ls -1 $incoming_dir | egrep '\.jpg$')

И пытаемся из этого списка в столбик слепить строчку из пар вида
TRUE "filename1.jpg" TRUE "filename2.jpg" [...]
разделенных все теми же пробелами.

Каждая такая пара призвана образовать в окошке zenity заранее взведенный чекбокс (ибо TRUE) или сброшенный (если написать FALSE) и то, что чекается этим чекбоксом (filenameNNN.jpg).

Например, так:
IFS=$'\n'
for i in $found_img; do
columns="$columns TRUE \"${i}\" "
done
(баш изначально путается в пробельных символах, отчего снабжен костыликом)

...или такой вот костылятор:
columns=$(echo -e "$found_img" | sed 's/^/TRUE \"/g; s/$/"/g')
columns=$(echo ${columns})

и пытаемся вставить ее, строку эту, в качестве параметров в конец команды zenity:
to_imgconvert=$(zenity --list --checklist --multiple --title="Обработка картинок" --text="Отметьте картинки для ресайза:" --column="Обработать" --column="Картинка" ${columns})

В  итоге хочется получить имена файлов, предварительно автоматически отфильтрованные грепом, а потом прореженные моей мышевозной дланью.

Как ни странно, это работает. Но. Ровно до того момента, когда в имени файла попадется пробел. В окошке zenity стройные ряды превращаются черт знает во что, хотя вывод на печать
echo -e ${columns}

рисует ровный кошерный ряд из TRUE и закавыченных имен файлов.

Если взять и спопипастить в zenity с экрана то, что рисует echo -e ${columns}, zenity отрабатывает отлично, невзирая на пробелы в именах файлов. А через доллар не вставляется.

Как тут я не извращался (начиная с подмены $IFS), как ни занимался непотребством с кавычками и скобочками, так ни черта и не вышло. Неужто лишь eval спасет отца русской демократии? (не пробовал пока.) Или как-то через пайп/поток надо?

Другие языки не предлагать, вопрос чисто про баш.
Если бы было достаточно man bash, не было бы ABS.

Оффлайн VladimirIP

  • Любитель
  • *
  • Сообщений: 55
    • Просмотр профиля
Попробуйте так, у меня с пробелами нормально выбирает
IFS=$'"'
declare -a chan
chan+=(`ls /tmp/*.mp3 | awk -F "\n" '{print " TRUE \"" $1}' | tr "\n" '"'`)
type=$(zenity --list --checklist --multiple --title 'Что-то' --text "Текст какой-то" --width=550 --height=850 --column="Метка"  --column="Файл" "${chan[@]}" )

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Это не у bash все запутано, просто у Вас не всё разложено
found_img=$(ls -1 $incoming_dir | egrep '\.jpg$')
Зачем grep'ать, если есть globbing?$incoming_dir/*.jpgИтак всё сводится к выводу списка из полей разделенных переводом строки:
Код: (bash) [Выделить]
for i in $incoming_dir/*.jpg; do echo -e "TRUE\n$i" ; done | zenity --list --checklist --column=Mark --column=File --separator="\n"
« Последнее редактирование: 17 Февраля 2015, 02:27:44 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28511
    • Просмотр профиля
Пробелы, переносы... как у баша с этим через все запутано!
man bash
Там всё распутано по пунктам. что, когда, где и как.

Цитировать
Задача, стало быть, такая.
Скрипт читает (ls) список файлов в каталоге, грепает и выводит в диалоговое графическое окно zenity (с чекбоксами).
Я расставляю мышою галки, жму «одобрямс» и скрипт дальше переваривает отобранное файло по алгоритму.
Ну и?… Проблем на копейку, садись и делай.

Цитировать
И вот, например, отфильтровываем жыпеги:
found_img=$(ls -1 $incoming_dir | egrep '\.jpg$')
Кавычки где забыл?…

found_img="$(ls -1 "$incoming_dir"/*.jpg)"

Цитировать
И пытаемся из этого списка в столбик слепить строчку из пар вида
TRUE "filename1.jpg" TRUE "filename2.jpg" [...]
разделенных все теми же пробелами.

Каждая такая пара призвана образовать в окошке zenity заранее взведенный чекбокс (ибо TRUE) или сброшенный (если написать FALSE) и то, что чекается этим чекбоксом (filenameNNN.jpg).

Например, так:
IFS=$'\n'
for i in $found_img; do
columns="$columns TRUE \"${i}\" "
done
(баш изначально путается в пробельных символах, отчего снабжен костыликом)
Это не баш, это вы, дорогуша, путаетесь.


Цитировать
...или такой вот костылятор:
columns=$(echo -e "$found_img" | sed 's/^/TRUE \"/g; s/$/"/g')
columns=$(echo ${columns})
echo -e
является непереносимой комбинацией. Либо используйте printf, либо найдите другой способ сказать, что вам хочется.
И, таки, кавычки забыли.

Цитировать
и пытаемся вставить ее, строку эту, в качестве параметров в конец команды zenity:
to_imgconvert=$(zenity --list --checklist --multiple --title="Обработка картинок" --text="Отметьте картинки для ресайза:" --column="Обработать" --column="Картинка" ${columns})
Таки опять кавычки забыли.

Цитировать
В  итоге хочется получить имена файлов, предварительно автоматически отфильтрованные грепом, а потом прореженные моей мышевозной дланью.

Как ни странно, это работает. Но. Ровно до того момента, когда в имени файла попадется пробел. В окошке zenity стройные ряды превращаются черт знает во что, хотя вывод на печать
echo -e ${columns}

рисует ровный кошерный ряд из TRUE и закавыченных имен файлов.

Если взять и спопипастить в zenity с экрана то, что рисует echo -e ${columns}, zenity отрабатывает отлично, невзирая на пробелы в именах файлов. А через доллар не вставляется.

Как тут я не извращался (начиная с подмены $IFS), как ни занимался непотребством с кавычками и скобочками, так ни черта и не вышло. Неужто лишь eval спасет отца русской демократии? (не пробовал пока.) Или как-то через пайп/поток надо?

Другие языки не предлагать, вопрос чисто про баш.

find /usr/share/example-content -iname \*.ogg -printf "TRUE\n%f\n'%p'\n" | \
zenity --list --checklist --multiple \
  --title="Обработка картинок" --text="Отметьте картинки для ресайза:" \
  --column="x" --column="Image" --column="Full path" \
  --hide-column=3 --print-column=3 --separator="\n" | xargs -n 1 echo
Вся ваша галиматья - в одну строчку.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
Господи, ужас какой! Сколько нужно парсить глазками. И все это оттого, что авторы шелла изначально смешали в одну кучу разные пробельные символы. И понеслась...
Цитировать
Это не баш, это вы, дорогуша, путаетесь.
Верно. Путаюсь в многочисленных и разнообразных костылях. Спасибо, что тычете мордою в ошибки. Постараюсь понять эту мутную логику бесчисленных скобочек и кавычечек. В крайнем случае, зазубрить.

Пользователь решил продолжить мысль 18 Февраля 2015, 00:12:36:
А вот это высказывание можно разжевать для тупого?
Цитировать
echo -e
является непереносимой комбинацией.
непереносимой между диалектами шелла или что?
« Последнее редактирование: 18 Февраля 2015, 00:12:36 от 027 »
Если бы было достаточно man bash, не было бы ABS.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
027,
Цитировать
Пробелы, переносы... как у баша с этим через все запутано!
начало rm ровно?
нужно начало ls.

Wars ~.o

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28511
    • Просмотр профиля
Господи, ужас какой! Сколько нужно парсить глазками.
Зачем? Есть же нормальные редакторы с подсветкой сиснтаксиса, даже nano это умеет.
Цитировать
И все это оттого, что авторы шелла изначально смешали в одну кучу разные пробельные символы. И понеслась...
Никто ничего не смешивал. Есть стандарт, прочти его, если тебе что-то непонятно.

Цитировать
Цитировать
Это не баш, это вы, дорогуша, путаетесь.
Верно. Путаюсь в многочисленных и разнообразных костылях.
Нет костылей. Есть стандарт.
Если ты чего-то не понимаешь - прочти или спроси, а не демонстрируй своё невежество дурацкими суждениями.

Цитировать
Спасибо, что тычете мордою в ошибки. Постараюсь понять эту мутную логику бесчисленных скобочек и кавычечек. В крайнем случае, зазубрить.
Нет ни одной "бесчисленной" скобочки. Правил всего два. ВСЕГО два правила. Это по-вашему бесчисленно?

Цитировать
А вот это высказывание можно разжевать для тупого?
Цитировать
echo -e
является непереносимой комбинацией.
непереносимой между диалектами
Именно.
dash (/bin/sh) вообще не имеет такого ключа, например.
Так что если вам надо что-то большее, чем просто вывасти строку на экран, используйте printf.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

 

Страница сгенерирована за 0.02 секунд. Запросов: 22.