Ребзя, хочу прикрутить к Twidge утилитку fortune, да знаний по bash не хватает. Суть токова, есть fortune (программа для вывода случайной цитаты в консоль), есть Twidge (программа для твиттинга из консоли). Нужно их подружить. На первый взгляд задача решается тривиальным встроенным костылем-рычагом —
fortune | twidge update
, но эта зараза рубит цитату при переносе строки. Велосипед я думаю состоит в том, чтобы выводить цитату сначала в файл на диск
fortune>file.txt
, а уже его скармливать Twidge. Перед этим неплохо бы воткнуть проверку на 140 символов и если их больше, то заставить fortune пюнуть в файлик еще раз. Подскажите люди добрые линуксоиды, как скрипт завелосипедить не будьте жлобами в самом деле :D ! Или может кто уже такое скостылил, а я просто профан и нагуглить не могу?
Спасибо, dude! Ты просто bash ниньзя! Танцы с файлом отменяются. Теперь надо бы подумать как сделать скрипт с проверкой, что фортунка меньше или равна 140 символов и можно увольнять секретаршу. У фортунок есть параметры может в эту сторону покапать? Наверное как-то можно ввести проверку размера фортунки...
Нет, что то не то... оно режет просто по 140 символ. Я тут в мане нашел что фортуна может отсеивать фортунки по длине с помощью опции -n Надо бы в эту сторону посмотреть...
Вот эта конструкция работает. Не мог бы ты просветить для чего опция -s ? В мане написано: " Short apothegms only. 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.
А... Т.е. типа мы задаем длину short фортунки по умолчанию 140 символов и просим программу выводить нам только короткие? Т.е. без опции -s он нам будет выводить и длинные ?
Не лишним было бы заметить, что значительная доля фортунок не просто содержит несколько строк, но вовсю используют возможности моноширной верстки, ну например (здесь меньше 140 знаков, если что):
<SilverStr> media ethics is an oxymoron, much like Jumbo Shrimp and
Microsoft Works.
<MonkAway> not to mention NT Security
При замене конца строки на пробел это превращается просто в кашу.
Кстати не подскажешь заодно как к фортунке добавить плюсом статичное сообщение, т.е чтобы выводилась фортунка и к ней добавлялось статичное что-нибудь типа хештега.
А, это решетка конструкцию портит? Похоже bash надо отдельно тщательно изучать. Не подскажешь какой годный материал или книгу? А то на форуме каждый раз флудить не охота.
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.
Похоже bash надо отдельно тщательно изучать. Не подскажешь какой годный материал или книгу?
Если вас интересует именно ГНУ Баш (которого мы здесь пока, собственно, не касались), то прилагаемое справочное руководство пролистать не мешает ((info "bash") / $ info bash / g.o/s/b/m). По остальным программам — аналогично.
Какие скрипты? Типа $ fortune -sn140 | tr -s '[:space:]' ' ' | twidge update? Ну едва ли это скрипт, но написан он, если можно так сказать, очевидным образом на fortune(1), tr(1), неком twigle и любой оболочке, умеющей в текстовые «трубы».
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.
Кстати, я что-то не спросил, а зря — зачем вам спонадобилось публиковать фортунки в Твиттере («твиттинг» ведь у вас именно это означает, да?), если не секрет?
Ну у меня давно стоит фортуна, а тут недавно я услышал, что twidge позволяет твитить прямо из консоли. Я и подумал чего бы их не связать и не запустить в крон автоматический твитинг, чтобы создать видимость активности на аккаунте. Твиттер может понадобится в будущем для многих вещей. Скажем для маленького бизнеса (интернет магазина) можно использовать в качестве оповещатора о предстоящих акциях и т.п., но на твиттер состоящий из одних рекламок, вряд ли подпишутся люди даже заинтересованные в магазине, а на твиттер набитого разного рода забавными цитатами вполне. Особенно женщины. Набивать в ручную не вижу смысла, компьютер на то и создан чтобы автоматизировать рутину. Кстати этот Twidge можно приспособить под разные мелкие сисадминские нужды. Например твитить остаток места на дисках. Или еще какую нибудь мелкую, но в тоже время полезную информацию, которую нужно оперативно получить многим людям не танцуя с настройкой почтовой рассылки. Да и к тому же почтовую рассылку надо все время админить добавлять и исключать получателей, а тут все просто, кто надо заходит и смотрит.Ну это конечно мои ламерские мысли, я не в курсе какие бывают еще инструменты для этого, может чего и удобней и тривиальней есть.
Речь ведем не о сферическом шелле в вакууме, а о bash. А его конструкции как бы наследие Posix shell. Тот факт что в том же Powershell, например, конвееры тоже обозначаются как «|» - это другая песня к разговору о bash не имеющая практического отношения.
Да нет
Окей, ссылку на стандарт Posix Shell, где такую конструкцию приняли.
Нет. В смысле, что встроенная тоже, разумеется, есть.
В современных шеллах - возможно. Но исторически это - внешняя программа. В отличие от [[.
Все таки для того чтобы сохранить форматирование фортунок моя первая мысль была правильная, что нужно фортунку отправлять в файлик, а из него скармливать его twidge.
Когда пишем в тестовый файл на английском
bla bla bla
Все ок скрипт отрабатывает и твитит содержимое файла с сохранением форматирования как и положено.
Но если написать тоже самое на русском бла бла бла
То в консоль выдается сообщение об ошибке
twidge: Enum.toEnum{Word8}: tag (1073) is outside of bounds (0,255)
Как без ошибок русские символы ему можно скормить?
Как можно быть наследником того, кто младше тебя? как бы наследие Posix shell как бы
Потрясающее умение читать часть предложения
При чем здесь вообще эта бумажка, чего вы к ней прицепились?
А к чему цепляться если ни к стандартам?
Удивительный вы человек! Вы же только что нагляднейше продемонстрировали обратное, не сумев определить, что [ — это встроенная команда.
Встроенная команда где? По ссылке выдержка всех встроенных команд bash с описанием. В упор не вижу там ни test ни [
Я понимаю если б я заявил что echo в bash - это вызов /bin/echo на основании того, что такой бинарник есть. Тут я был бы не прав, опять же - потому что в bash-е echo - это встроенная команда, это явно видно по приведенной мною ссылке.
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: [: команда не найдена
Но что вы в данном случае делаете, я вовсе не понимаю. Если вам надо подставить вывод fortune(1) агрументами к twidge, то это делается как-то так: $ twidge update «$(fortune -s -n 140)»
Да это работает так же как и ввод с помощью cat разницы особо нет, спасибо конечно за подсказку. Затык в том, что отправляя таким способом текст twidge мы решаем проблему с многострочным твитом. Не надо резать строки. Но вот печаль беда... это работает только для английского текста, а для русского выдается ошибка
twidge: Enum.toEnum{Word8}: tag (1073) is outside of bounds (0,255)
Вот в чем проблема. И она выдается что для вашего академичного способа, что для моего велосипедного. Я вот и хотел поинтересоваться может русский текст как-то нужно экранировать или в ковеер какой засовывать?
Но вот печаль беда... это работает только для английского текста, а для русского выдается ошибка
Ну а что я вам отвечу — поставил я этот twidge — на $ twidge update он говорит, что не настроен и советует запустить $ twidge setup, а него в свою очередь просит какой-то ключ авторизации.
И, честно говоря, я не понял, вы еще и русские фортунки собрались печатать?