Pull to refresh

Comments 48

echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"

Можете объяснить что это за уличная магия?
tput hpa N — сдвиг курсора на N позиций
tput cols получает ширину окна терминала
tput cub 6 — сдвигает курсор на 6 позиций влево

Таким образом [OK] прижимается к краю.
Если ты используешь tput для указания положения текста, то почему бы им же не выставлять цвет текста, вместо эскейп-кодов?
tput setaf 0..7 — цвет текста
tput setab 0..7 — цвет фона
tput srg0 — сброс на дефолтный
И другие опции
Простите ошибочка
tput sgr0 — сброс на дефолтный
хреново читаю. уже есть: )
"Изучаем tput"
tput cols — получение числа колонок на устройстве вывода
tput hpa _ — передвинуть курсор в позицию __
$(tput hpa $(tput cols) — передвинуть курсор в конец строки
tput cub 6 — сдвинуть курсор влево на 6 знаков.

Вне зависимости от размера экрана, курсор позиционируется на 6 символов от правого края. Потом печатается нужный текст.
А ещё хотелось бы знать, во всех ли системах есть команда tput, насколько она стабильна и т.п. А то по прошествии года университетские лабораторки почему-то не запустились — обновление что-то сломало…
Авторитетным источником выступить не смогу, но из строчки "tput is a standard Unix operating system command which is used to set terminal features" можно сделать вывод, что эта команда присутствует и во всех *nix системах и стабильна.
Может ещё зависеть от (настроек) терминала, видимо. Живой пример — tput cols, cub и cup работает, а tput hpa — нет.
UFO just landed and posted this here
Спасибо. В следующей части расскажу. А еще про нотиферы и звуковое оповещение. Есть еще пожелания?
>rm test_file || ok=0

есть же $? — статус выполнения последней команды.

кроме того, скрипт из примера съедает ошибку и в своем коде возврата всегда возвращает 0, типа ничего и не было.
Действительно, исправил. Спасибо.
Просто на практике мне приходилось анализировать сразу несколько команд, и там предыдущий вариант казался логичным. Про $? я и не подумал даже.
whiptail забыли. там же такие красивые менюшечки ((:
whiptail --title Habr --checklist "Simple checkbox menu" 12 35 3 $(echo {hello,habra,habr}" '' 0" )
Можно сказать, что не забыл. Помните, в статье я рассказывал про dialog. А теперь фокус… Заменяем whiptail на dialog:
dialog --title Habr --checklist «Simple checkbox menu» 12 35 3 $(echo {hello,habra,habr}" '' 0" )
И смотрим, что получилось :)
Ну все же один на ncurses основан, а другой на newt и slang.
Хотя разница, с точки зрения пользователя, не так уж и велика.
Хорошо, спасибо. Напишу в статье, что существует альтернатива.
Тут еще можно поспорить, кто кому альтернативой является: зачастую whiptail установлен в дефолтной системе, а вот dialog еще ставить надо.
Есть еще getopts. Когда надо передать различные параметры и ключи, удобнее чем через ${1-9}
О, вот про что я забыл! Спасибо.
Ни слова про функции, думаю это фундаментально.
А также ничего про то как включить файл конфигурации, хотя про него сказано. Для быстрого справочника который Вы пытаетесь сделать, думаю информация была бы уместной.
Про функции я хотел упомянуть, когда буду рассказывать про getopts. Про включение файла конфигурации вставлю. Хотя я больше интерфейсы хотел рассмотреть. Их применение программистом может быть очень разное.
UFO just landed and posted this here
Материал интересный, но продолжение нужно обязательно, т.к. есть еще много нераскрытых моментов, как например (заметили уже) — функции.

Нашел свой скрипт, на котором немного изучил bash. Он помогает обновлять систему на машине без интернета, с помощью обычной флешки: сначала создаётся список пакетов, на другой машине (с интернетом) они закачиваются, потом на первой машине устанавливаются.
Там есть примеры взаимодействия с пользователем, функции, всяческие условия-циклы, использование других утилит (gpg в частности), комменты и сообщения на русском, короче, вдруг пригодится кому:

dl.dropbox.com/u/22991016/updates.sh
Как видите, явным недостатком этого метода является привязанность к конкретной среде рабочего стола. Да и вообще к графической среде, которая может и отсутствовать. Но, тем не менее, может и пригодиться когда-нибудь.

Можно в скрипте анализировать переменную окружения DESKTOP_SESSION. Различать GNOME, KDE, какую-то другую (переменная определена, но не равна ни GNOME, ни KDE) и текстовую консоль (переменная не определена) для того, чтобы выбрать gdialog/zenity (думаю стоит указать, что zenity это обновленный gdialog, доступный в GNOME уже давно), kdialog, dialog.

Пытался в свое время найти какой-то стандартный способ определения в скриптах не только среды исполнения, но и пользовательских предпочтений — не смог. Может кто знает?
Я не сталкивался с необходимостью использования GUI в скриптах. Да и неправильно это как-то. Консольный вывод привычнее.
Кому привычней, а кому нет. Да и задача может стоять как создание GUI приложения, являющегося по сути враппером к CLI инструментам. Неужели разрабатывать полноценное приложение на Сях, питоне или, прости господи, PHP?
А если скрипт запускается из левой директории можно делать так:
MyDir=`cd -P "$(dirname "$0")" && pwd`

. "$MyDir"/config.cfg

Да, . config.cfg проще и удобнее, но source ./config.cfg нагляднее (:

Но вот не пойму зачем:
MyDir=`cd -P "$(dirname "$0")" && pwd`
. "$MyDir"/config.cfg


Разве . config.cfg не всегда сработает?
Не сработает, если скрипт запущен из другой рабочей директории.
Либо я чего-то не догоняю, либо одно из двух. Команда cd -P "$(dirname "$0")" && pwd указывает в ту директорию, их которой запущен скрипт. А значит дает тот же результат, что и . config.cfg. Так ведь?
Ох блин…
Ок, на примере :)
Скрипт у нас лежит в /root, называется допустим script.sh.
Находясь в директории /root вызываем /root/script.sh — все ок.
Находясь в любой другой директории вызываем /root/script.sh — получаем ошибку о том что не найден config.cfg.
cd -P "$(dirname "$0")" && pwd меняет директорию на ту, где расположен скрипт, а не откуда он запущен, таким образом позволяя подгрузить конфиг. Пишу ее в переменную MyDir я для того, чтобы если что иметь возможность переключаться между директориями. Развивая тему:

# определяем рабочую директорию
WorkDir=`pwd`

# определяем директорию где расположен скрипт с конфигом и возвращаемся обратно
MyDir=`cd -P "$(dirname "$0")" && pwd && cd "$WorkDir"`

# читаем конфиг
. "$MyDir"/config.cfg

# далее выполняем всю работу как обычно, в текущей рабочей папке
Гуястам:
xmessage -buttons Yes:0,No:1 -default Yes 'Are you sure?'

xmessage, правда, дистроспецифичен. С недавнего времени наличие иксов в арчике не подразумевает автоматически его наличия.

Ну а если делать красиво, то, видимо, анализировать $DESKTOP_SESSION и в зависимости от его значения вызывать kdialog/gdialog
UFO just landed and posted this here
А если пишем скрипт установки какой-нибудь игрушки? Юникс не только для серверов!
Паковать в deb/rpm/etc
Не надо вот этих вот скриптов установки.
А если политика партии требует устанавливать только для текущего пользователя, в $HOME? Причём дело может быть не только в копирастии, но и в желании не требовать для неё прав супер пользователя.
Тогда зачем вам вообще инсталлятор?
Пакуйте игру в архив, пользователь распакует где захочет и запустит там же.
UFO just landed and posted this here
Это не совсем оболочки. Я хотел публиковать в интерфейсы, но тогда кармы не хватило. Хотя сейчас думаю, что *nix все-таки более подходящий блог. Можно считать два последних заголовка приложением.
В любом случае, полезно иметь на счету такие инструменты, как GUI. Есть пользователи, которые панически боятся консоль. Или захочется получить эстетическое удовольствие.
А вообще, GUI будет полезен, если скрипт автостартует с графической оболочкой.
Sign up to leave a comment.

Articles