командная строка
Настройка функциональных клавиш в ZSH
Как единообразно задействовать функциональные клавиши в zsh на различных терминалах
Маленький, но очень мощный date
ну наверное все знаю функционал линуксовой команды date, вывод даты в самом разном формате.
а также есть функционал вычисления дат. например сегодня у меня Thu Aug 14 16:09:28 EEST 2008
вчера:
$ date --date="yesterday" +%F $ date --date="1 days ago" +%F 2008-08-13
воскресенье через 2 недели:
$ date --date="sunday next 2 week" Sun Aug 31 01:00:00 EEST 2008
если мы скажем день недели - date будет иметь ввиду ближайший такой день (или сегодняшний)
$ date --date="friday" +%F 2008-08-15
аналогично если добавить this: this friday.
Сканирование и послеобработка изображений из командной строки
Возникла необходимость отсканировать пару страничек с паспорта и отослать по почте. Задача решилась таким вот способом.
# настраиваем сканер $ sudo apt-get install sane libsane $ rehash $ sudo sane-find-scanner -q found USB scanner (vendor=0x04a9 [Canon], product=0x220e [CanoScan], chip=LM9832/3) at libusb:004:004 $ sudo scanimage -L device `plustek:libusb:004:004' is a Canon CanoScan N1240U/LiDE30 flatbed scanner # сканируем две странички паспорта в out1.pnm и out2.pnm $ sudo xscanimage # конвертим .pnm в .jpg $ convert out1.pnm ukr-pass-1.jpg $ convert out2.pnm ukr-pass-2.jpg # проверяем что получилось $ feh ukr-pass*.jpg # поворачиваем на 180 градусов если надо. (повернуть фотографии можно и прямо в feh) $ convert -rotate 180 ukr-pass-2.jpg ukr-pass-2.jpg # сливаем два изображения в одно $ montage -adjoin -geometry 1024x768 ukr-pass-1.jpg ukr-pass-2.jpg ukr-pass.jpg # почистим за собой $ rm out1.pnm out2.pnm ukr-pass-1.jpg ukr-pass-2.jpg # отошлем сканы $ mutt -a ukr-pass.jpg
phpinfo() из командной строки
Я сталкиваюсь с php только как админ (ну или подправить пару строчек в чужом скрипте) и часто надо возникает необходимость проверять настройки php на сервере. Для этого я создавал файлик с таким содержимым:
<?php
phpinfo();
?>называл его как то info.php, забрасывал в корневой каталог какого нибуть сайта на сервере и открывал в броузере.
Это был самый очевидный путь, и он меня вполне устраивал Ж:-)
Но недавно мне подсказали более простой путь узнать эту информацию прямо в командной строке:
$ php -iНелинейные конвейеры
Допустим вам нужно сравнить вывод двух команд с помощью diff. Обычная методика - создание временных файлов, однако это можно сделать и на лету:
$ diff <(date +%M) <(date +%T)
1c1
< 55
---
> 00:55:21Коллекция форк бомб
Время от времени в сети мне попадаются различные реализации форк бомб, и вот накопилась небольшая коллекция Ж:-)
Предупреждение: не уверен? не запускай!
1. bash
:(){ :|:&};:
2. perl
$ perl -MPOSIX -e '$pid=fork; exit if $pid; setid; fork while(1)'3. sh
создаем файлик с таким содержимым и запускаем его
#!/bin/sh $0 & $0 &
4. sh by Anonymous
$ echo '. ./_&. ./_'>_;. ./_придумал вариацию на тему
. ./_`echo . ./_\&. ./_>_`Присылайте другие варианты Ж:-)
Просмотр diff из потока в цвете
Часто приходится смотреть diff не из файла, а из потока, например сформированный командой cvs diff или svn diff.
Удобно в таком случае просматривать в цвете в vim, не записывая в файл, а прямо в потоке.
наример:
$ svn co svn://anonsvn.kde.org/home/kde/branches/KDE/3.5/kdelibs/kdecore/ $ cd kdecore $ svn diff -r 181258:183456 kglobalaccel_x11.cpp | vim -
diff покажется красиво раскрашенным Ж:-)
PS
подсветка текста в консоли
Иногда хочется пропустить текст через такой фильтр, как grep, но чтобы он только подсветил совпадения, а не вырезал строки с ними.
Можно использовать вот такую функцию, которую можно добавить в ваш ~/.bashrc или ~/.zshrc:
function hilight { ESC=`echo -e "\033"` COLORON="$ESC[1;33m" COLOROFF="$ESC[1;0m" if [ -z "$1" ] ; then echo "Usage: hilight 'regex' [file1 file2 ...]" 1>&2; return 1 fi REGEX="$1" shift sed -e "s/${REGEX}/${COLORON}&${COLOROFF}/g" $* }
пример использования:
$ hilight слово *UPD:
можно подобное реализовать на grep ( коментарий с пояснениями)
Именованный pipe замкнутый сам на себя
Абсолютно бесполезный пример как можно замкнуть именованный пайп сам на себя. для демонстрации на каждой итерации
добавляется пара >< что бы продемонстрировать что что-то таки происходит Ж:-)
зачем? да просто так Ж:-D
#!/bin/sh PIPE=infinity.pipe [ -p $PIPE ] && rm $PIPE mkfifo $PIPE # инициируем пересылку echo "go!" >> $PIPE & while read GO; do # все что пришло - читаем echo "$GO" # сообщаем что мы таки живы выводя то что крутится в канале sleep 1 # это можно убрать, но будет слишком быстро Ж:-) # возвращаем обратно в pipe все что пришло + пара символов # если символов больше 12 - начать сначало echo ">$GO<" | sed -e 's/.\{20\}.*/go!/' >> $PIPE done < $PIPE
Редактирование сложных команда в bash и zsh
Часто бывает что вам необходимо редактировать сложную команду в шеле. Например написать мини скрипт, или составить список файлов которые выхотите удалить в директории с большим кол-вом файлов и где не подходят маски.
В bash в режиме emacs(установленный по умолчанию) ctrl-x ctrl-e вызодвет редактор прописанный в переменной окружения EDITOR.
В zsh вы можете добится того же эффекта добавив в ~/.zshrc
autoload -U edit-command-line zle -N edit-command-line bindkey -M emacs "^X^E" edit-command-line # для режима emacs bindkey -M vicmd v edit-command-line # для командного режима vi
Теперь в режиме emacs будет такоеже поведение как в bash.
А в командном режиме vi достаточно нажать v
Определение типа файла
если вы друг нашли какой нибуть файл, и не знаете какого он типа(аудио, фильм, скрипт...), то определить тип файла поможет утилита file
для одного файла:
$ file /bin/zsh
/bin/zsh: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV) for GNU/Linux
2.4.1, dynamically linked (uses shared libs), for GNU/Linux 2.4.1, strippedдля нескольких файлов сразу:
$ file bin/postit requiem_for_a_dream-lux_aeterna.mp3 goodye_lenin.avi
bin/postit: Bourne shell script text executable
requiem_for_a_dream-lux_aeterna.mp3: MPEG ADTS, layer III, v1, 128 kBits,
44.1 kHz, JntStereo
goodbye_lenin.avi: RIFF (little-endian) data,
AVI, 512 x 288, 25.00 fps, video:
DivX 4, audio: MPEG-1 Layer 3 (stereo, 48000 Hz)Цветной вывод команд в консоли
Устали от черно серого терминала(вариант: черно зеленого Ж:-)?
Можно порадовать себя всевозможными способами в буквальном смысле разукрасить свою жизнь в консоли. Но как обычно этого может быть мало, и как всегда найдется человек доведший идею до мараз^W логического конца Ж:-)
Этот набор врапперов над более чем 80 самыми расспространенными программами(df, ping, gcc... так же наиболее часто используемыми файлами /etc/fstab, /var/log/messages...) который разукрашивает вывод этих команд в косоли. Читаем дальше...
Скрипт для временного поста файлов в интернет
Часто бывает что нужно временно выложить в интернет какой нибудь файл и дать ссылку для скачивания. Этот скрипт облегчает заливку файлов на сервер по ssh и выводит урл
Пример использования:
$ postit bin/postit bin/postit.html postit 100% 370 0.4KB/s 00:00 postit.html 100% 2060 2.0KB/s 00:00 http://remote.org.ua/tmp/postit http://remote.org.ua/tmp/postit.html
#!/bin/sh # by ramok (c) 2006 idea by nexus # upload files by ssh, and show url # change your settings hire SSH_URL=user@remote.org.ua:~user/www/data/tmp/ WWW_URL=http://remote.org.ua/tmp/ # try do not touch below Ж;-)) [ -z $1 ] && printf "Usage: `basename $0` file [file..]" 1>&2 && exit 1 scp $@ $SSH_URL echo $@ | sed -e 's|[^ /]*/||g' -e 's|\([^ /]*\)[ ]*|'${WWW_URL}'\1\n|g'
подсветка результатов работы grep
GNU grep имеет удобную возможность подсвечивать цветом найденный паттерн
добавте это в ~/.bashrc или ~/.zshrc
export GREP_OPTIONS='--color=auto' #export GREP_COLOR='5;38' #мигающий export GREP_COLOR='1;33' #ярко-желный на черном
быстрая отмена алиасов в bash и zsh
могут быть алиасы которые по имени совпадают с программой
например
less='~/bin/less.sh' ls='ls -FA --color=auto' vi=vim
но иногда надо запустить программу, а не алиас. временно отменить выполнение алиаса можно так
$ \lsстрока статуса в screen
добавляем в ~/.screenrc
caption always "%?%F%{-b bc}%:%{-b bb}%?%C|%D|%M %d|%H%?%F%{+u wb}%? %L=%-Lw%45>%{+b by}%n%f* %t%{-}%+Lw%-0<"взято отсюда http://aperiodic.net/phil/configs/screenrc
немного подправил что бы убрать цвета и использую пока это
caption always "%?%F%{-b}%:%{-b}%?%C|%D|%M %d|%H%?%F%{+u}%? %L=%-Lw%45>%{+b}%n%f* %t%{-}%+Lw%-0<"разбор параметров командной строки в скриптах с помощью getopts
для разбора параметров в скриптах чаще всего используются две программы - getopt и getopts
первая для начала довольно сложна и излишне функциональна, поэтому рассмотрим разбор на примере более простой getopts
стандартный скелет скрипта
#!/bin/sh # while getopts OPTIONS_LIST option do case $option in OPTION) ACTION;; esac done shift $((OPTIND - 1)) ### ТЕЛО СКРИПТА ###
getopts понимает только простые однобуквенные опции, либо вообще без, либо с обязательным аргументом.
все опции, которые программа должна обрабатывать указываются вместо OPTIONS_LIST. если опция требует обязательный параметр, то после ее буквы надо поставить двоеточие.
ПРИМЕР: rvo:x
такая строчка показывает, что надо обрабатывать опции -r, -v, -o и -x, причем -o требует аргумента.
далее указывается переменная, куда будет сохранятся найденная опция. в данном случае это option
Просмотр зарегистрированных сочетаний клавиш в bash
Тут уже проскакивало несколько типсов про различные сочетания клавиш в bash, но ведь гораздо приятнее разузнать все самому, чем ждать, что кто-то тебе что-то расскажет...
Итак, запускаем bash, вводим комманду
$ bind -p | egrep -v '^#|sel|low'и получаем самые актуальные сведения о зарегистрированных сочетаниях клавиш.Тут уже проскакивало несколько типсов про различные сочетания клавиш в bash, но ведь гораздо приятнее разузнать все самому, чем ждать, что кто-то тебе что-то расскажет...
Итак, запускаем bash, вводим комманду
$ bind -pв ответ она вывалит все зарегистрированные и не очень сочетания клавиш. чтоб избвиться от лишнего мусора, сделаем что-то типа
$ bind -p | egrep -v '^#|sel|low'и получаем самые актуальные сведения о зарегистрированных сочетаниях клавиш.
слева идет само сочетание, где \C - Ctrl, а \M - Meta (в большинстве систем это Esc)
Немного магии sed Ж:-)
Несколько забавных примеров:
$ echo metric | sed -e strictest metes $ echo dated | sed -e statement demented $ echo routing | sed -e stoutest resting $ echo face | sed -e secede fade $ echo ontology | sed -e sentence oncology
Для тех кто не понял подсказка Ж:-)
SUSv3 по этому поводу:
"Any character other than backslash or can be used instead of
a slash to delimit the BRE and the replacement."


