shell
выход из bash без сохранения истории
перевод типса из shell-fu.
самый простой вариант это SIGKILL своего шелла:
kill -9 $$
вариант по-нежнее:
unset SAVEFILE; unset HISTFILE;
выполнение команды в zsh в зависимости от синтаксиса введённой строки
Бывает так, что надоедает дописывать к началу скопированной в терминал, к примеру, из браузера, ссылки, саму команду, которая должна эту ссылку обработать. Например, вот так (где | - текущее положение курсора):
> |<c-v> > git://github.com/pieter/git-bzr.git|<home> > git clone |git://github.com/pieter/git-bzr.git
Если Вам это знакомо, то Вы понимаете, о чём я. Причём речь не обязательно о git:// для git clone; это может быть lp: или bzr:// для bzr branch, http:// - для wget или aria2c, file:/// - для cd ну и т.д. и т.п. - вариантов множество и примеры использования могут зависеть от того, с какими видами пар ссылка/действие приходится работать. Конечно, можно настроить короткие алиасы для команд, но можно и пойти чуть дальше - можно настроить, что же должен выполнить zsh в зависимости от синтаксиса введённой строки. Для этого нужно отредактировать .zshrc файл, добавив туда функцию precmd (чуть подробнее про precmd можно прочитать в комментариях к коду в этом совете - http://linsovet.com/content/настройка-приглашений-zsh) примерно следующего содержания:
Отключение вывода логов на tty-терминал
Бывает так, что для комфортной работы на одном из виртуальных терминалов (tty[1-6]) мешают сообщения ядра о том или ином событии (например, о подключении usb flash или о статусе работы того или иного устройства). Для отключения сообщений можно воспользоваться утилитой для настройки аттрибутов терминала; выполните в текущем виртуальном терминале команду:
$ sudo setterm -msg offТеперь сообщения на текущем виртуальном терминале появляться не будут.
За дополнительной информацией просьба обращаться к соответствующей man-странице по setterm.
Очистка временых файлов в shell-скриптах
Допустим у вас есть shell-скрипт который создаёт временные файлы, именованые пайпы и прочие вещи которые необходимо очищать перед окончанием скрита.
Но если пользователь прервал работу вашего скрипта (например по ctrl-c), то в системе останется мусор.
Проблема решается регистрацией обработчика сигнала EXIT. Например
#!/bin/sh TMPFILE=`mktemp` trap "rm -f $TMPFILE; echo процедура очистки 1>&2" EXIT # ....
Когда скрипт закончится (не зависимо от того закончится он нормально или пользователь его прервёт), обработчик удалит временный файл и выведет отладочное сообщение.
Грубо говоря это аналог C-шной фунции atexit() или C++-шного деструктора класса (только для всего скрипта).
Отправка в twitter последней введённой строчки в терминале
Бывает так, что, используя twitter, (если Вы вдруг не знаете, что это такое, то можете проходить мимо; если не знаете, но стало интересно, кликайте сюда) хочется на ответ "what are you doing now" скопипастить ту команду, которая была выполнена в оболочке. Чтобы сделать это стандартными средствами, через браузер, нужно слишком много телодвижений, поэтому это не наш Путь. В связи с этим хочется предложить пользователям twitter'а (ну и заодно операционных систем семейства GNU/Linux) скрипт, выполнение которого отправляет последнюю введённую в терминале команду в Ваш twitter-аккаунт:
> $любимый_текстовый_редактор twitshСкопируем строчки:
обработка аргументов с помощью getopts в конце строки
Бывает так, что нужно создать скрипт, при вызове которого дополнительные аргументы командной строки должны идти в конце. Например, чтобы
$ ./script action -o a -p -t argumentвыполнял действие action, при этом обрабатывая аргументы -o -p -t, но при
$ ./script -o a -p -t action argumentвыводил справку по использованию. (По такому принципу работает ряд утилит; в частности - многие распределённые системы контроля версий - git, mercurial, bazaar и т.п.)
Традиционно, для обработки аргументов используется утилита getopts; в Сети также можно без проблем найти множество примеров её использования.
Приблизительный пример же того, что нужно нам:
#!/bin/bash #... USAGE="script <action> <options> [file | directory]"; case "$1" in #обрабатываем действие, которое предусмотренно скриптом action1 | action2 ) action="$1" ;; #в противном случае выводим справку по использованию
настройка приглашений zsh
Бывает так, что, работая бОльшую часть времени только с одной учётной записи и с одного хоста, осознаешь бессмысленность раздутого на пол-экрана терминала приглашения командной строки наподобие
myuseraccount@mycomputer:/path/to/some/folder $
Зная, что в zsh можно задействовать второе приглашение, справа и, умея пользоваться гуглом, проковырявшись с настройкой конфига, хотелось бы поделиться куском скрипта, который, скопировав в .zshrc, будет делать следующее:
WCD - Wherever Change Directory
Wcd - тулза для быстрой смены директорий. Позволяет экономить время на наборе. Можно набрать только часть имя директории и программа сама прыгнет в нее. Также поддерживаются регулярные выражения.
Интерактивная apt-оболочка
Бывает так, что длительная работа с apt из терминала немного надоедает и начинает утомлять ввод длинных последовательностей семейства команд apt-*. Однако существует утилита aptsh, которая запускает в терминале интерактивную оболочку для работы с apt. Данная утилита входит в репозитарии многих debian-based дистрибутивов.
Чтобы после установки запустить оболочку, выполните:
$ sudo aptsh
После запуска будет выведено приглашение:
>
Далее можно работать с командами apt, но без необходимости вводить перед ними apt-*. Например, для получения информации о пакете, достаточно выполнить:
> search aptsh
Или, например, чтобы получить исходный код пакета, выполните:
> source aptsh
Выйти из сеанса в shell-оболочку можно командой exit или quit:
> exit
За дополнительной информацией просьба обращаться к соответствующей man-странице.
читалка заголовков писем на googlemail
Читалка заголовков мэйлов с googlemail:
#!/bin/sh URL='https://mail.google.com/mail/feed/atom' curl --silent -u name@googlemail.com:passwd $URL | \ grep -v Gmail | \ while read line do echo $line | grep "<title>" 1>/dev/null \ && TITLE=`echo $line | sed -e 's/<title>//' -e 's/<\/title>//'`;\ echo $line | grep "<name>" 1>/dev/null \ && NAME=`echo $line | sed -e 's/<name>//' -e 's/<\/name>//'`;\ echo $line | grep "<email>" 1>/dev/null \ && EMAIL=`echo $line | sed -e 's/<email>//' -e 's/<\/email>//'` && \ echo $(echo $NAME "<"$EMAIL">" $TITLE) done
P.S. Лучшего применения чем прикрутить эту штуку на dzen не нашел :-)
Где найти ifconfig простому пользователю
Начинающие часто сталкиваются с проблемой того что ifconfig не запускается при работе под обычным пользователем:
$ ifconfig
zsh: command not found: ifconfig
$И сразу возникает вопрос: "где дать прав/прописать/внести в группу что бы ifconfig запускался".
Ответ:
Скрипт перевода русских слов набраных в английской расскладке
Многие печатают смотря на клавиатуру и поэтому не сразу замечают что печатают по русски не переключив раскладку. Или у меня когда сижу на с плохим интернетом, то при печати в аське которая на сервере прежде чем видишь что печатаешь, проходит секунд 10 и успеваешь пару предложений набрать Ж:-)
Простенький скрипт перевода русских слов набранных в английской раскладке. Построчно переводит стандартный ввод и выводит результат на стандартный вывод. Можно как параметр скрипта указывать имя файла (мне ни разу не понадобилось правда Ж:-).
Учтите что сам скрипт сохранён в KOI8-R кодировке, а после чего iconv -f koi8-r переводит вывод в вашу текущую локаль (у меня например ru_RU.UTF-8).
Что бы не мучатся с перекодировкой можно просто скачать (не забываем переименовать и дать права на исполнение Ж:-).
#!/bin/sh
# for translation wrong typed text like: hfvjr -> рамок
cat $* |
tr "qwertyuiop[]nm,./QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?" \
"йцукенгшщзхъфывапролджэячсмитьбю/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ?" |
iconv -f koi8-rПример использования:
$ 2cyr ye xnj e dfc nfv dc. yjxm uekzkb& ну что у вас там всю ночь гуляли& ^D $
Как узнать размеры терминала в скрипте
Иногда полезно узнать размеры терминала в котором работает ваш скрипт (например при использовании dialog).
0. По умолчанию терминалы под X-Window устанавливают размеры терминалов в переменные LINES и COLUMNS.
Но к сожалению в скрипты они не экспортятся Ж:-(
1. Можно воспользоватся программой stty, если она поддерживает параметр size
$ stty size 71 159 $ eval `stty size | sed -e 's/\(.*\) \(.*\)/LINES=\1 COLUMNS=\2/'` $ echo $LINES $COLUMNS 71 159 $
2. Если на машине установлен ncurses (а сейчас сложно тайти машину на которой он не стоит Ж:-)
то можно воспользоваться программой tput.
COLUMNS=`tput cols` LINES=`tput lines`
3. Если на машине установлен X-Window, то можно воспользоваться командой resize которая возвращает
код на sh для установки переменных LINES и COLUMNS.
$ resize COLUMNS=159; LINES=71; export COLUMNS LINES; $ eval `resize` $ echo $LINES $COLUMNS 71 159 $



