LINUX.ORG.RU

Кривая работа zenity в bash скрипте

 , , , ,


0

1

Всем привет. Есть некий фрагмент bash скрипта.

команда без нужных нам аргументов

zenity_command="zenity --list --radiolist --title=\"MONITOR MODE\" --text=\"выберите wifi adapter\" --column=\">\" --column=\"Adapters:\""

получаем аргументы в lst

lst=$(ip l | sed '/link/d' | awk '{print $2}' | sed 's/\://' | tr -s '\r\n' ' ')

создаём временный файл чтобы достать аргументы для команды.

знаю что костыльный метод, но количество аргументов нам

неизвестно, нормальный алгоритм я пока-что не придумал

touch tsunamiTEMPFILE.txt
for item in $lst
do

пробрасываем аргументы через item, и доводим их до ума

добавляя FALSE (так нужно для zenity). Далее кидаем их в

временный файл, ибо как через for сразу их закидывать в

переменную zenity_command я не разобрался, буду рад

помощи в корекции этого алгоритма

echo -n " FALSE \"$item\"" >> tsunamiTEMPFILE.txt
done

получаем аргументы в arguments_zenity ; удаляем

временный файл ; выполняем команду с аргументами

arguments_zenity=$(cat tsunamiTEMPFILE.txt); rm -f tsunamiTEMPFILE.txt
$zenity_command$arguments_zenity

Конец кода. Ожидание : https://imgur.com/T8skhRu.png Реальность : https://imgur.com/hktXriy.png

p.s: нам неизвестно количество wifi адаптеров p.s2: пожалуй я добавил слишком много комментариев, но так вы сразу разберётесь в чем дело p.s3: скорее всего там просто где-то символ перевода строки спрятался, и поэтому gui в zenity ломается. но найти я его никак не могу

делаешь set -x и видишь что у тебя вот такая команда:

    zenity --list --radiolist '--title="MONITOR' 'MODE"' '--text="выберите' wifi 'adapter"' '--column=">"' '--column="Adapters:"' FALSE '"lo"' FALSE '"enp3s0"'


решай вопрос с кавычками. для баша кавычки ообъединяют позиционные параметры разделенные пробелами в один параметр.

bl ★★★
()
Ответ на: комментарий от bl

bl, спасибо что решил помочь.

Извини, но я немного нуб, и ничего не понял из того что ты написал. Что мне конкретно нужно делать с кавычками ?

Turtle_soup
() автор топика

Пока не поздно, возьми нормальный язык программирования вместо Bash’а. Например, Python и любой GUI-биндинг к нему.

В 2020 году ковыряться с двадцатью видами кавычек и экранировать пробелы могут лишь, скажем так, очень странные люди.

Опыт написания скриптов на Python тебе в будущем может пригодиться, а вот опыт написания Bash-лапши – никогда.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

EXL,

Хорошо, приму это к сведению. Но сейчас мне нужно решить конкретно этот вопрос

Turtle_soup
() автор топика
Ответ на: комментарий от ananas

ananas,

Спасибо, это помогло.

ls /sys/class/net избавило от ip l | sed ‘/link/d’ | awk ‘{print $2}’ | sed ‘s/://’ | tr -s ‘\r\n’ ’ ’)

Но как работают следующие 3 строки ? Как echo добавляет FALSE\n$i в конец команды ? Если-бы там было echo -en, то я ещё что-то мог бы предположить

Как работает done | zenity ? Оказывается done читается циклом во время его выполнения, а не только говорит о конце цикла, но почему он стоит первее zenity ? И, в конце концов, почему это работает так: zenity <…> FALSE eth0 вместо zenity <…>FALSEeth0 ???

Turtle_soup
() автор топика
Ответ на: комментарий от ananas

anans,

Очень интнересно. Именно из-за постоянных открытий для себя, я отдаю предпочтение скриптам bash вместо всяких там python, и т.д. конечно то что выхлоп цикла передаётся в STDIN это было логично, но я всё равно не понял нескольких тут деталей. Буду разбираться. Спасибо

Turtle_soup
() автор топика
Ответ на: комментарий от EXL

опыт написания Bash-лапши – никогда

Опыт чтения может, к сожалению

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.