LINUX.ORG.RU

Помогите разобраться с Twidge и Bash

 , ,


2

3

Ребзя, хочу прикрутить к Twidge утилитку fortune, да знаний по bash не хватает. Суть токова, есть fortune (программа для вывода случайной цитаты в консоль), есть Twidge (программа для твиттинга из консоли). Нужно их подружить. На первый взгляд задача решается тривиальным встроенным костылем-рычагом —

fortune | twidge update 
, но эта зараза рубит цитату при переносе строки. Велосипед я думаю состоит в том, чтобы выводить цитату сначала в файл на диск
fortune>file.txt
, а уже его скармливать Twidge. Перед этим неплохо бы воткнуть проверку на 140 символов и если их больше, то заставить fortune пюнуть в файлик еще раз. Подскажите люди добрые линуксоиды, как скрипт завелосипедить не будьте жлобами в самом деле :D ! Или может кто уже такое скостылил, а я просто профан и нагуглить не могу?


но эта зараза рубит цитату при переносе строки

Убрать перенос строки:

fortune | tr '\n' ' ' | twidge update

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

Спасибо, dude! Ты просто bash ниньзя! Танцы с файлом отменяются. Теперь надо бы подумать как сделать скрипт с проверкой, что фортунка меньше или равна 140 символов и можно увольнять секретаршу. У фортунок есть параметры может в эту сторону покапать? Наверное как-то можно ввести проверку размера фортунки...

xtala ()
Ответ на: комментарий от ArcFi

Нет, что то не то... оно режет просто по 140 символ. Я тут в мане нашел что фортуна может отсеивать фортунки по длине с помощью опции -n Надо бы в эту сторону посмотреть...

xtala ()
Ответ на: комментарий от ArcFi

Вот эта конструкция работает. Не мог бы ты просветить для чего опция -s ? В мане написано: " Short apothegms only. See -n on which fortunes are considered" не совсем втыкаю для чего их вместе использовать.

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

See -n on which fortunes are considered

Разумный же совет, не?

       -n length
              Set the longest fortune length (in characters) considered to  be
              ``short''  (the  default is 160).  All fortunes longer than this
              are considered ``long''.  Be careful!  If you set the length too
              short  and  ask for short fortunes, or too long and ask for long
              ones, fortune goes into a never-ending thrash loop.
Zmicier ★★★★★ ()
Ответ на: комментарий от Zmicier

А... Т.е. типа мы задаем длину short фортунки по умолчанию 140 символов и просим программу выводить нам только короткие? Т.е. без опции -s он нам будет выводить и длинные ?

xtala ()
Ответ на: комментарий от ArcFi

Все раскурил, фимиам :) . Спасибо, дружище за помошь много плюсов тебе в карму, в следующей жизни станешь брахманом :D.

xtala ()
Ответ на: комментарий от ArcFi

fortune | tr '\n' ' '

Не лишним было бы заметить, что значительная доля фортунок не просто содержит несколько строк, но вовсю используют возможности моноширной верстки, ну например (здесь меньше 140 знаков, если что):

<SilverStr> media ethics is an oxymoron, much like Jumbo Shrimp and
            Microsoft Works.
<MonkAway> not to mention NT Security

При замене конца строки на пробел это превращается просто в кашу.

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

Что такое моноширная верстка? Я пошел в гугл, но он знает только про моноширный шрифт. Что такое моноширная верстка?

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

При замене конца строки на пробел это превращается просто в кашу.

Тут уж ничего не поделаешь, но можно чутка улучшить читабельность, если убрать дублирующиеся пробелы:

fortune -sn140 | tr '\n' ' ' | tr -s ' ' | twidge update

ArcFi ()
Ответ на: комментарий от xtala

Аргумент 140 пробелом не надо отделять?

Если оно не ругается на синтаксис, то не обязательно.
Для многих утилит такая форма записи допустима.

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

если убрать дублирующиеся пробелы:
tr -s ' '

Ага. Только там еще табуляции бывают. Но не надо дописывать еще один вызов tr(1), это все вполне укладывается в:

$ fortune -sn140 | tr -s '[:space:]' ' ' | twidge update
Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от xtala

только про моноширный шрифт. Что такое моноширная верстка?

Верстка, эксплуатирующая возможности, даваемые моноширным шрифтом же! Машинописная, если вам так угоднее.

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

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

xtala ()
Ответ на: комментарий от ArcFi

А, это решетка конструкцию портит? Похоже bash надо отдельно тщательно изучать. Не подскажешь какой годный материал или книгу? А то на форуме каждый раз флудить не охота.

xtala ()
Ответ на: комментарий от ArcFi

(fortune -sn140; echo #test) | ...

Совершенно излишняя подоболочка.

{ fortune -sn140; echo '#test'; } | ...
Zmicier ★★★★★ ()
Ответ на: комментарий от xtala

А, это решетка конструкцию портит?

3.1.3 Comments
--------------

In a non-interactive shell, or an interactive shell in which the
`interactive_comments' option to the `shopt' builtin is enabled (*note
The Shopt Builtin::), a word beginning with `#' causes that word and
all remaining characters on that line to be ignored.

(info "(bash) Comments")

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

Похоже bash надо отдельно тщательно изучать. Не подскажешь какой годный материал или книгу?

Если вас интересует именно ГНУ Баш (которого мы здесь пока, собственно, не касались), то прилагаемое справочное руководство пролистать не мешает ((info "bash") / $ info bash / g.o/s/b/m). По остальным программам — аналогично.

Если нужен более учебник, чем руководство, то материалы под редакцией Грега Вулиджа. К сожалению, они большей частью несвободны.

Не надо пока читать «Advanced Bash Scripting Guide» Менделя Купера, хотя когда научитесь видеть грубые ошибки, то будет можно и даже небесполезно.

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

Какие скрипты? Типа $ fortune -sn140 | tr -s '[:space:]' ' ' | twidge update? Ну едва ли это скрипт, но написан он, если можно так сказать, очевидным образом на fortune(1), tr(1), неком twigle и любой оболочке, умеющей в текстовые «трубы».

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

Posix shell. Баш - надмножество Posix shell, ни одной баш-специфичной конструкции в результирующем наборе команд нет. Пайпы(вот эти вот «|», если благородному дону угоден русский вариант - «трубы») - это не bash-специфичная вещь. Вызов внешней команды(fortune, tr, twigle) - тоже.

Отвлеченный пример: есть две конструкции if, например такая:

if [ "$foo" = "bar" ]; then
exit 0
fi

И вот такая:

if [[ "$foo" = "bar" ]]; then
exit 0
fi

Так вот - первая сработает в любом шелле, который совместим с POSIX sh. А вот вторая - нет, это т.называемый «башизм», и работать это будет только в bash, ну и еще может в шеллах, которые озабочены совместимостью с bash.

Причем, смешная штука, [ - это внешняя команда. Бинарник. Проверить можешь командой which [. А вот [[ - это встроенная конструкция языка в bash.

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

Posix shell

Совершенно не обязательно. Хоть Си-шелл, хоть вообще cmd.exe.

есть две конструкции if

Конструкция if-то здесь все-таки одна и та же.

это т.называемый «башизм»

Да нет. Не говоря уж о том, что само слово весьма глупое.

Причем, смешная штука, [ - это внешняя команда. Бинарник.

Нет. В смысле, что встроенная тоже, разумеется, есть.

Проверить можешь командой which

Нет. Этим костылем такие вещи не проверяются.

Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 2)

Кстати, я что-то не спросил, а зря — зачем вам спонадобилось публиковать фортунки в Твиттере («твиттинг» ведь у вас именно это означает, да?), если не секрет?

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

это т.называемый «башизм»

Да нет. Не говоря уж о том, что само слово весьма глупое.

Обоснуй.

anonymous ()
Ответ на: комментарий от Zmicier

Ну у меня давно стоит фортуна, а тут недавно я услышал, что twidge позволяет твитить прямо из консоли. Я и подумал чего бы их не связать и не запустить в крон автоматический твитинг, чтобы создать видимость активности на аккаунте. Твиттер может понадобится в будущем для многих вещей. Скажем для маленького бизнеса (интернет магазина) можно использовать в качестве оповещатора о предстоящих акциях и т.п., но на твиттер состоящий из одних рекламок, вряд ли подпишутся люди даже заинтересованные в магазине, а на твиттер набитого разного рода забавными цитатами вполне. Особенно женщины. Набивать в ручную не вижу смысла, компьютер на то и создан чтобы автоматизировать рутину. Кстати этот Twidge можно приспособить под разные мелкие сисадминские нужды. Например твитить остаток места на дисках. Или еще какую нибудь мелкую, но в тоже время полезную информацию, которую нужно оперативно получить многим людям не танцуя с настройкой почтовой рассылки. Да и к тому же почтовую рассылку надо все время админить добавлять и исключать получателей, а тут все просто, кто надо заходит и смотрит.Ну это конечно мои ламерские мысли, я не в курсе какие бывают еще инструменты для этого, может чего и удобней и тривиальней есть.

xtala ()
Ответ на: комментарий от Zmicier

Хоть Си-шелл, хоть вообще cmd.exe.

Речь ведем не о сферическом шелле в вакууме, а о bash. А его конструкции как бы наследие Posix shell. Тот факт что в том же Powershell, например, конвееры тоже обозначаются как «|» - это другая песня к разговору о bash не имеющая практического отношения.

Да нет

Окей, ссылку на стандарт Posix Shell, где такую конструкцию приняли.

Нет. В смысле, что встроенная тоже, разумеется, есть.

В современных шеллах - возможно. Но исторически это - внешняя программа. В отличие от [[.

Нет. Этим костылем такие вещи не проверяются.

Прекрасно проверяются. Сомневающиеся заглянцовывают strace-ом.

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

Я тут все таки поковырялся и набросал простенький как два рубля скриптик

#!/bin/bash
config_file=$(cat test)
twidge  update "$config_file"
Все таки для того чтобы сохранить форматирование фортунок моя первая мысль была правильная, что нужно фортунку отправлять в файлик, а из него скармливать его twidge.
Когда пишем в тестовый файл на английском
bla
bla
bla
Все ок скрипт отрабатывает и твитит содержимое файла с сохранением форматирования как и положено.
Но если написать тоже самое на русском
бла
бла
бла
То в консоль выдается сообщение об ошибке
twidge: Enum.toEnum{Word8}: tag (1073) is outside of bounds (0,255)
Как без ошибок русские символы ему можно скормить?

Pinkbyte ArcFi может вы знаете?

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

config_file=$(cat test)

Чисто для справки — для чтения файла в переменную целиком cat не нужен:

$ config_file=$(< test)

Но что вы в данном случае делаете, я вовсе не понимаю. Если вам надо подставить вывод fortune(1) агрументами к twidge, то это делается как-то так:

$ twidge update "$(fortune -s -n 140)"
Zmicier ★★★★★ ()
Ответ на: комментарий от Pinkbyte

Речь ведем не о сферическом шелле в вакууме, а о bash

Никак нет. Именно, что о любом. Ну по крайней мере, я не знаю ни одной оболочки, что не умеет в поточные конвейеры.

А его конструкции как бы наследие Posix shell.

Чушь какая. Как можно быть наследником того, кто младше тебя?

ссылку на стандарт Posix Shell, где такую конструкцию приняли.

?

При чем здесь вообще эта бумажка, чего вы к ней прицепилсь?

Нет. Этим костылем такие вещи не проверяются.

Прекрасно проверяются

Удивительный вы человек! Вы же только что нагляднейше продемонстрировали обратное, не сумев определить, что [ — это встроенная команда.

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

Как можно быть наследником того, кто младше тебя?
как бы наследие Posix shell
как бы

Потрясающее умение читать часть предложения

При чем здесь вообще эта бумажка, чего вы к ней прицепились?

А к чему цепляться если ни к стандартам?

Удивительный вы человек! Вы же только что нагляднейше продемонстрировали обратное, не сумев определить, что [ — это встроенная команда.

Встроенная команда где? По ссылке выдержка всех встроенных команд bash с описанием. В упор не вижу там ни test ни [

Я понимаю если б я заявил что echo в bash - это вызов /bin/echo на основании того, что такой бинарник есть. Тут я был бы не прав, опять же - потому что в bash-е echo - это встроенная команда, это явно видно по приведенной мною ссылке.

Pinkbyte ★★★★★ ()
Последнее исправление: Pinkbyte (всего исправлений: 2)
Ответ на: комментарий от Pinkbyte
pinkbyte@oas1 ~/dev $ cat 1.sh
#!/bin/bash
if [ "$res" != 0 ]; then
        echo 'Good!'
fi
pinkbyte@oas1 ~/dev $ bash 1.sh
1.sh: line 2: [: команда не найдена

Бинарник [ я заблаговременно переименовал

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

Хм, хотя вот тут говорят что [ в bash 4 - это builtin. Тогда 2 проблемы - кто-то не обновил официальный man и у меня bash сломан :-)

Update: info bash на моей системе кстати тоже утверждает что [ и test - это встроенные команды, причем унаследованные от bourne shell.

Так что да, тут я был не прав. Однако интересен тогда вопрос - какого рожна он всё-таки лезет за [ в /bin? :-)

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

Так что да, тут я был не прав. Однако интересен тогда вопрос - какого рожна он всё-таки лезет за [ в /bin?

Кто? which? Так он сам внешняя исполняемость, никакого отношения к ГНУ Башу не имеет и знать, что́ в нем что, не может.

$ type which
which is /usr/bin/which

Тогда как:

$ type [
[ is a shell builtin
Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

Встроенная команда где [https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html] По ссылке выдержка всех встроенных команд bash с описанием. В упор не вижу там ни test ни [

А еще вы не видите там cd, pwd, eval, exec, exit и т. д. Они описаны в другой главе руководства — (info "(bash) Bourne Shell Builtins").

На будущее стоит иметь в виду, что в хороших руководствах всегда есть предметный указатель (index):

i [ RET

или

i test RET

(Это после <f1> TAB bash или $ info bash, если ГНУ Емакс вдруг кончился.)

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

Похоже bash надо отдельно тщательно изучать.

Заняться больше нечем? Бери fish.

anonymous ()
Ответ на: комментарий от Zmicier

Но что вы в данном случае делаете, я вовсе не понимаю. Если вам надо подставить вывод fortune(1) агрументами к twidge, то это делается как-то так: $ twidge update «$(fortune -s -n 140)»

Да это работает так же как и ввод с помощью cat разницы особо нет, спасибо конечно за подсказку. Затык в том, что отправляя таким способом текст twidge мы решаем проблему с многострочным твитом. Не надо резать строки. Но вот печаль беда... это работает только для английского текста, а для русского выдается ошибка

twidge: Enum.toEnum{Word8}: tag (1073) is outside of bounds (0,255)
Вот в чем проблема. И она выдается что для вашего академичного способа, что для моего велосипедного. Я вот и хотел поинтересоваться может русский текст как-то нужно экранировать или в ковеер какой засовывать?

xtala ()
Ответ на: комментарий от Zmicier

Про type я в курсе, в этом и проблема

pinkbyte@oas1 ~ $ type ls
ls is aliased to `ls --color=auto'
pinkbyte@oas1 ~ $ type cd
cd is a shell builtin
pinkbyte@oas1 ~ $ type [
[ is /usr/bin/[

Приехали :-)

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

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

Ну а что я вам отвечу — поставил я этот twidge — на $ twidge update он говорит, что не настроен и советует запустить $ twidge setup, а него в свою очередь просит какой-то ключ авторизации.

И, честно говоря, я не понял, вы еще и русские фортунки собрались печатать?

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