командная строка


Настройка функциональных клавиш в ZSH

Как единообразно задействовать функциональные клавиши в zsh на различных терминалах

5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)
bliznezz аватар

Маленький, но очень мощный 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.

4.75
Ваша оценка: Ничего Рейтинг: 4.8 (4 голоса)
ramok аватар

Сканирование и послеобработка изображений из командной строки

Возникла необходимость отсканировать пару страничек с паспорта и отослать по почте. Задача решилась таким вот способом.

# настраиваем сканер 
$ 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
4
Ваша оценка: Ничего Рейтинг: 4 (1 vote)
ramok аватар

phpinfo() из командной строки

Я сталкиваюсь с php только как админ (ну или подправить пару строчек в чужом скрипте) и часто надо возникает необходимость проверять настройки php на сервере. Для этого я создавал файлик с таким содержимым:

<?php
    phpinfo();
?>

называл его как то info.php, забрасывал в корневой каталог какого нибуть сайта на сервере и открывал в броузере.
Это был самый очевидный путь, и он меня вполне устраивал Ж:-)

Но недавно мне подсказали более простой путь узнать эту информацию прямо в командной строке:

$ php -i
0
Ваша оценка: Ничего

Нелинейные конвейеры

Допустим вам нужно сравнить вывод двух команд с помощью diff. Обычная методика - создание временных файлов, однако это можно сделать и на лету:

$ diff <(date +%M) <(date +%T)
1c1
< 55
---
> 00:55:21
0
Ваша оценка: Ничего
ramok аватар

Коллекция форк бомб

Время от времени в сети мне попадаются различные реализации форк бомб, и вот накопилась небольшая коллекция Ж:-)
Предупреждение: не уверен? не запускай!

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 . ./_\&. ./_>_`

Присылайте другие варианты Ж:-)

0
Ваша оценка: Ничего
ramok аватар

Просмотр 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

5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)

подсветка текста в консоли

Иногда хочется пропустить текст через такой фильтр, как 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&gt;&2; 
                return 1 
        fi 
 
        REGEX="$1" 
        shift 
 
        sed -e "s/${REGEX}/${COLORON}&${COLOROFF}/g" $* 
}

пример использования:

$ hilight слово *

UPD:
можно подобное реализовать на grep ( коментарий с пояснениями)

0
Ваша оценка: Ничего
ramok аватар

Именованный 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
0
Ваша оценка: Ничего
ramok аватар

Редактирование сложных команда в 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

0
Ваша оценка: Ничего
ramok аватар

Определение типа файла

если вы друг нашли какой нибуть файл, и не знаете какого он типа(аудио, фильм, скрипт...), то определить тип файла поможет утилита 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)
0
Ваша оценка: Ничего
ramok аватар

Цветной вывод команд в консоли

Устали от черно серого терминала(вариант: черно зеленого Ж:-)?
Можно порадовать себя всевозможными способами в буквальном смысле разукрасить свою жизнь в консоли. Но как обычно этого может быть мало, и как всегда найдется человек доведший идею до мараз^W логического конца Ж:-)

Этот набор врапперов над более чем 80 самыми расспространенными программами(df, ping, gcc... так же наиболее часто используемыми файлами /etc/fstab, /var/log/messages...) который разукрашивает вывод этих команд в косоли. Читаем дальше...

5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)
ramok аватар

Скрипт для временного поста файлов в интернет

Часто бывает что нужно временно выложить в интернет какой нибудь файл и дать ссылку для скачивания. Этот скрипт облегчает заливку файлов на сервер по 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'
0
Ваша оценка: Ничего
ramok аватар

подсветка результатов работы grep

GNU grep имеет удобную возможность подсвечивать цветом найденный паттерн

добавте это в ~/.bashrc или ~/.zshrc

export GREP_OPTIONS='--color=auto'
#export GREP_COLOR='5;38' #мигающий
export GREP_COLOR='1;33' #ярко-желный на черном
0
Ваша оценка: Ничего
ramok аватар

быстрая отмена алиасов в bash и zsh

могут быть алиасы которые по имени совпадают с программой
например

less='~/bin/less.sh'
ls='ls -FA --color=auto'
vi=vim

но иногда надо запустить программу, а не алиас. временно отменить выполнение алиаса можно так

$ \ls
0
Ваша оценка: Ничего
ramok аватар

строка статуса в 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<"
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

0
Ваша оценка: Ничего

Просмотр зарегистрированных сочетаний клавиш в bash

Тут уже проскакивало несколько типсов про различные сочетания клавиш в bash, но ведь гораздо приятнее разузнать все самому, чем ждать, что кто-то тебе что-то расскажет...
Итак, запускаем bash, вводим комманду

$ bind -p | egrep -v '^#|sel|low'

и получаем самые актуальные сведения о зарегистрированных сочетаниях клавиш.Тут уже проскакивало несколько типсов про различные сочетания клавиш в bash, но ведь гораздо приятнее разузнать все самому, чем ждать, что кто-то тебе что-то расскажет...
Итак, запускаем bash, вводим комманду

$ bind -p

в ответ она вывалит все зарегистрированные и не очень сочетания клавиш. чтоб избвиться от лишнего мусора, сделаем что-то типа

$ bind -p | egrep -v '^#|sel|low'

и получаем самые актуальные сведения о зарегистрированных сочетаниях клавиш.
слева идет само сочетание, где \C - Ctrl, а \M - Meta (в большинстве систем это Esc)

0
Ваша оценка: Ничего
ramok аватар

Добавление в приглашение zsh кода ошибки программ и расшифровки сигнал

Если программа завершается с ненулевым кодом ошибки то его можно отображать в prompt что бы если что по документации можно выяснить что означает это возвращаемое значение.
Если программа прервана сигналом то zsh возвращает код возврата 128 + номер сигнала(в bash тоже).

Зная это + немножно знания zsh можно добавить в свое приглашение удобную фичу Ж:-)

Подсмотрено в стандартных prompt идущих с zsh

Заносим в precmd() где нибуть в вашем ~/.zshrc

precmd ()
{   
    setopt noxtrace localoptions
    local exitstatus=$?
    [[ $exitstatus -ge 128 ]] && psvar[1]=" $signals[$exitstatus-127]" ||
        psvar[1]=""       
}

после чего

setopt PROMPT_SUBST
p_rc="%(?..[%?%1v])"

И вставляем $p_rc в свой любимый prompt.
Например сделаем так что бы отображалось права в командной строке

$ export RPROMPT=$p_rc

Проверяем как работает

$ true
$
0
Ваша оценка: Ничего
ramok аватар

Немного магии 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."

0
Ваша оценка: Ничего