zsh

зайти в screen на удалённой системе

Tags: •  •  •  •  • 

Требуется: Приатачиться к screen, запущенному на удалённой системе с минимальным количеством телодвижений.

Решение:
Не обязательно, но все таки:
1. делаем беспарольную аутентификацию как рассказно здесь
затем
2.

$ ssh -t login@host 'source .bashrc; screen -x'

Готово!

3. И на последок, что бы все вышеперечисленное таки совершалось с наименьшим количеством телодвижений, создаем скрипт:

$ cat >remotescreen
!#/bin/sh 
ssh -t login@host 'source .bashrc; screen -x'

$chmod 755 remotescreen

3.a ... или делаем алиас в любимом .*shrc
[code]

zsh + mc

Tags: •  •  •  •  •  • 

Давно читаю советы с этого сайта за что всем спасибо.
Вроде нигде такой совет не проскакивал, в общем мой совет:

В zsh я пользуюсь темой приветствия adam2
на днях решил её поправить чтобы показывала не только директорию и пользователя с именем машины но и кое что ещё
но не это важно, а то что за одно я решил избавиться от старого глюка связанного с этой темой,
а именно с проблемой потери размера консоли

.-(~)---------------------------------------------------------------------------------------------------------(denis@tentorium)-
`-->      
.-(~)---------------------------------------------------------------------------------------------------------(denis@tentorium)-
`--> `-->  
.-(/var/cache/dictionaries-common)----------------------------------------------------------------------------------------------
-----------(denis@tentorium)-
`--> 

т.е. после запуска mc и перехода в /var/cache/dictionaries у нас приглашение съехало.

Изображение пользователя ramok.

Быстрый перезапуск команды с дополнительным параметром

Tags: •  • 

В продолжении темы об использовании ссылки на предыдущую команду.
Часто при копировании директорий забываю добавлять флажок -r. Выручает !!.

/media/cd/$ cp SST_SDA /usr/local/dump/tmp
cp: пропуск каталога `SST_SDA'
/media/cd/[1] $ !! -r
cp SST_SDA /usr/local/dump/tmp -r
/media/cd/$

Изображение пользователя ramok.

Вставка последнего аргумента предыдущей команды в bash и zsh

Tags: •  • 

В bash и zsh в стандартном режиме (он же зовется emasc-режим, это тот который не vi-режим Ж:-)
есть удобное сочетание клавиш Esc-. позвляющее вставлять последнее слово аргументов прошлой команды.

Пример использования. Например прочитали новость о выходе нового релиза игрушки glest и решили глянуть что за зверь такой.

# так как лень, то ищем есть ли в репозитории
$ apt-cache search glest
glest-data - A free 3d real-time customizable strategy game
glest - A free 3D real-time customizable strategy game

# o, есть. смотрим описание и зависимости
$ apt-cache show Esc-.
Package: glest
...
Depends: glest-data (= 3.1.0-1), ..
...
Description: A free 3D real-time customizable strategy game
 Glest takes place in a context which could be compared to that of the
 pre-renaissance Europe, with the licence that magic forces exist in the
 environment and can be controlled.

# ок. устраивает установим 
$ sudo apt-get install Esc-.
Чтение списков пакетов... Готово
Построение дерева зависимостей       
Reading state information... Готово
...

# смотрим что поставилось, какие запусные файлы, есть ли мануалы, README.Debian и что там
$ dpkg -L Esc-.
/.
/usr
/usr/games
/usr/games/glest
...

# ну и запустим
$ Esc-.

Как видно из примера не плохо облегчает жизнь Ж:-)

Если вы используете zsh в vi режиме, то получить эту фичу в режиме вставки можно добавив в свой ~/.zshrc

bindkey -M viins '^[.' insert-last-word

Только учтите что между нажатием Esc и . должно пройти меньше секунды, иначе zsh перейдет в командный режим vi-режима.

Изображение пользователя ramok.

Подсветка потока ошибок в zsh

Tags: •  •  • 

Часто сообщения об ошибках теряются в общем потоке вывода данных, и их хотелось бы как нибуть выделять. Тут опять пригодятся глобальные алиасы zsh.

Добавим в ~/.zshrc

autoload colors # подключим цвета
colors

alias -g  HE='2>>( sed -ue "s/.*/$fg_bold[red]&$reset_color/" 1>&2 )' # Highlight Errors

После перезагрузки zsh у нас появится глобальный алиас HE который можно использовать на ряду с другими фильтрами. Алиас запускает в фоне sed который подсвечивает строки, и перенаправляет ему в на выход стандартный поток ошибок

Пример работы: мы хотим найти в /etc все файлы в названии которых есть zsh и при этом подсветить в каких каталогах поиск не удался.

Пояснения: строка

$ find /etc HE GI zsh

Развернется в
find /etc 2>>( sed -ue "s/.*/$fg_bold[red]&$reset_color/" 1>&2 ) | grep -i zsh

Глобальный алиас GI описан здесь.
Подсведка результатов grep описана здесь

BUGS: алиас запускает асинхронный процесс подсведки цветов, что обозначает что подсвеченые ошибки могут выводится не синхронно с потоком стандартного вывода.

PS
Для пользователей bash существует полезный скрипт по подсвечиванию потока ошибок для программы переденной как параметр.

Изображение пользователя ramok.

Еще более удобное обращение к родительским каталогам в zsh

Tags: • 

Как то был уже совет о том как удобно обращаться к родительским каталогам в zsh.
Но ни что не стоит на месте и появилась более интерактивная версия этого совета Ж:-)

1. Создаем ~/.zsh/function/ и добавляем туда файл expand-dot с таким содержанием

if [[ $LBUFFER = *.. ]]; then
    LBUFFER+=/..
else
    LBUFFER+=.
fi

2. В ~/.zshrc добавляем следуюещее

fpath=(~/.zsh/function $fpath)
autoload -U expand-dot
zle -N expand-dot
bindkey . expand-dot

3. Перезапускаем zsh и пробуем как работает. Набираем

$ cd ...

должно развернутся в cd ../.. и каждая новая введенная точка разворачиватся в дополнительные /..

Изображение пользователя ramok.

Маска для дот-файлов

Tags: •  •  • 

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

 cp -r .* backup-dir

То есть .* говорит "любое имя файла или директории начинающиеся с точки". Но тут есть подвох. Дело в том что в каждой директории есть две директории с именами . и .., что обозначает "текущая директория" и "родительская директория" соответсвенно.
 cp -r .??* backup-dir

То есть .??* говорит "любое имя файла или директории начинающиеся с точки и содержащая не меньше двух символов". Хотя конечно эта маска не охватывает файлы короче трех символов. Лично я часто пользуюсь этой маской, потому что она применима для большинства случаев и короткая Ж:-)

Спасибо darkk-у, подсказал правильную sh маску .[^.]*

Самая правильная маска для этого выглядит в zsh так:

cp -r .*~(.|..)(^@) backup-dir

.* "все файлы начинающиеся с точки"
~ "отрицание,все маски что идут после ~ не влючены в результат"
(.|..) "имя файлов . или .."
(^@) "не символические ссылки"

ну или еще более правильная для копирования дот-файлов из домашней директории

cp -r ${HOME}/.*~${HOME}/(.|..)(^@) backup-dir

PS
как это выглядит в bash?

Изображение пользователя ramok.

Цифровые аргументы для dd в шеснадцатиричном виде

Tags: •  •  •  •  • 

Как ни странно утилита dd не поддерживает цифровые аргументы в шеснадцатиричном виде, хотя часто бывает нужно указать смещение или размер блока в более удобном для этого шеснадцатиричном виде. Более того в зависимости от аргумента, если передать число в шеснадцатиричном виде, в С нотации, то dd может или закончится ошибкой или проинтерпретировать как 0. Например:

$ dd bs=0x1
dd: неверный номер `0x1'
$  dd count=0x1
0+0 записей считано
0+0 записей написано
 скопировано 0 байт (0 B), 1,248e-05 секунд, 0,0 kB/s

Изображение пользователя ramok.

Быстрый перезапуск команды под sudo в шелле

Tags: •  •  • 

Правила хорошего тона и безопасности требуют работать под не привилегированным пользователем и пользоваться sudo в случае необходимости. Но тогда часто возникают ситуации подобные этой:

$ tail -f /var/log/messages
tail: невозможно открыть `/var/log/messages' для чтения: Отказано в доступе
tail: больше нет файлов

Быстрый способ перезапуска предыдущей команды в bash и zsh

$  sudo !!

Изображение пользователя ramok.

Автоматическое экранирование спец-символов в URL в zsh

Tags: • 

Часто интернет адреса содержат в себе символы которые в командной строке обрабатываются по своему, например символы &, ?, ~ и так далее.
Поэтому если хочется указать в командной строке URL, его необходимо экранировать кавычками " или '.
Я, например, привык пользоваться wget, elinks, mplayer, youtube-dl из командной строки, и раздражает что вместо того что бы просто вставить из буфера мышкой нужный URL, нужно его экранировать кавычками. Но положение спасает модуль к zsh который автоматически распознает что происходит попытка ввести URL и экранирует спец символы с помощью \.

Добавьте в ~/.zshrc

autoload -U url-quote-magic
zle -N self-insert url-quote-magic

Пример можно видеть тут. В этом примере ссылка на YouTube была просто скопирована из буфера мышкой, и автоматически был подставлено два экранирующих символа.

Иногда такой "умный" модуль может мешать. Например при попытке скачать одими махом 9 файлов использую подстановку в шеле {n-m}

wget http://audio.cdbaby.com/09d09496/mp3lofi/p/r/projectmusic-0{1-9}.mp3

Модуль будет пытаться экранировать {}, и придется побороться с ним Ж:-)

Так что использовать этот модуль или нет - решать вам.

Изображение пользователя ramok.

Клавиши инкремента/декремента в a-la-vim в zsh

Tags: •  • 

В продолжении темы переноса удобных фич из vim в zsh Ж:-)
В vim есть такая приятность как Клавиши инкремента/декремента в vim. В zsh в contrib есть скрипт который делает подобно, но он не прыгает до ближайшего числа в строке вправо, как в vim. То есть хотелось бы
в командном режиме эмуляции vi в zsh иметь такие же клавиши инкримента (ctrl-a) и декримента (ctrl-z (так как ctrl-x занят в zsh на множество функций)).

1. Устанавливаем в ~/.zsh/function нужные там фунции

$ mkdir -p ~/.zsh/function
$ cd ~/.zsh/function
$ wget http://rusmafia.org/linux/files/vi-add-numeric.txt -O vi-add-numeric
$ wget http://rusmafia.org/linux/files/vi-substract-numeric.txt -O vi-substract-numeric

2. Добавляем в свой ~/.zshrc

bindkey -v                     # режим эмуляции vi клавишь
fpath=(~/.zsh/function $fpath) # добавляем директорию где будут лежать
                               # наши функции

# подружаем нужные нам фунции и вешаем их на клавиши ctrl-a и ctrl-z
autoload -U vi-add-numeric vi-substract-numeric
zle -N vi-add-numeric
zle -N vi-substract-numeric
bindkey    "^A" vi-add-numeric
bindkey -a "^A" vi-add-numeric
bindkey    "^Z" vi-substract-numeric
bindkey -a "^Z" vi-substract-numeric

3. Перегружаем zsh и пробуем Ж:-)

Изображение пользователя ramok.

Вызов помощи в zsh по F1

Tags: •  •  • 

Если вы набираете команду в zsh и забыли какой либо ключик, было бы неплохо нажать F1 и получить помошь по команде.

Вносим в ~/.zshrc

autoload zsh/terminfo
bindkey $terminfo[kf1] run-help

запускаем zsh заново, набираем например
find . -<F1>

и автоматически будет вызвано run-help find. Приятно что после выходи из мана вы можете продолжать
редактировать туже строку.

PS.
По мотивам справедливого замечания anonymous-a.

Для людей использующих vi режим в zsh может быть интересно это.

Изображение пользователя ramok.

vim-like клавиша вызова помощи в zsh

Tags: •  •  • 

В zsh, при редактировании большой команды, часто не хватает вызвать помощь что бы подсмотреть забытый параметр. Можно конечно посмотреть в другой консоли, но можно вот если бы можно было нажать магическую клавишу, прочитать показанную помощь, и продолжить редактирования команды... С другой стороны в vim есть замечательная возможность вызывать man для слова под курсором. Почему бы не перенести эту возможность из vim в zsh? Ж:-)

1. Заносим в ~/.zshrc

# zsh будет работать в "vi режиме"
bindkey -v

# так же как в vim, K будет вызывать помощь для команды, в командном режиме
bindkey -a K run-help

2. Теперь во время редактирования команды достаточно перейти в командный режим "vi режима" (жмем esc) и затем жмем "K".

Отличие поведение этой команды от vim, в том что помощь будет вызываться не для слова под курсором, а для команды в начале строки.
Так же приятная особенность в том что для встроенных команд zsh будет показан соответствующий раздел помощи zsh.

Изображение пользователя ramok.

Краткий справочник по массовому переименовыванию файлов :-)

Tags: •  •  •  •  •  • 

Иногда нужно производить массовые переименования файлов. Изучая командную строку юникса когда то, меня удивило отсутствие такой приятной возможности в DOS как массовые переименовывания файлов (помню было что то типа copy *.c *.bak).

1. По первому разу я просто в vi создавал множество команд mv производящие нужные действия. Самый очевидный, и самый трудоемкий путь Ж:-)

2. Позже я начал разбираться с командной строкой юникса и мог запрограммировать массовые переименования.

for i in *.c; do
  mv $i `echo $i | sed 's/\.c$/.bak/'`
done

Изображение пользователя ramok.

Удобные alias для работы с временными директориями

Tags: • 

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

В моем ~/.zshrc есть два этих алиаса

# создать директорию и перейти в нее
mkd(){ mkdir "$1" && cd "$1"; }

# если текущая директория пустая, то удалить ее и перейти в родительскую директорию
rmd(){ local P="`pwd`"; cd .. && rmdir "$P" || cd "$P"; }

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

1. мне надо создать временную рабочую директорию для экспермента

ramok@~ mkd tmp
ramok@~/tmp

2. работем в этой временной директории, например разархивируем архивы с Масяней, из предыдущего типса
ramok@~/tmp unrar x ../Masjanja_Mult__EPIDEM.RU_.part1.rar

UNRAR 3.40 freeware      Copyright (c) 1993-2004 Alexander Roshal


Extracting from ../Masjanja_Mult__EPIDEM.RU_.part1.rar

Creating    Masjanja.Mult                                             OK
Creating    Masjanja.Mult/Masjanja_swf                                OK
Creating    Masjanja.Mult/Masjanja_swf/Extra                          OK
Extracting  Masjanja.Mult/Masjanja_swf/Extra/exs1.exe                 OK 
....
Extracting  Masjanja.Mult/Masjanja/Zdorove.exe                        OK 
All OK
ramok@~/tmp

Посмотрели чего хотели, перенесли/удалили куда/что надо..

3. удаляем уже не нужную временную директорию

ramok@~/tmp rmd
ramok@~

Изображение пользователя ramok.

Использование команды перенаправления без команды

Tags: •  •  •  • 
В sh совместимых шелах есть такая возможность создавать файлы пустого размера или обнулять существующие:
# если файла tmp.txt не существовало, создается файл нулевого размера
sh% ~/ > tmp.txt  
sh% ~/ ls -l tmp.txt 
-rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt

# если файл tmp.txt существовал, то файл обнуляется
sh% ~/ echo 123 > tmp.txt 
sh% ~/ ls -l tmp.txt         
-rw-rw-r-- 1 ramok ramok 4 2007-06-09 11:33 tmp.txt
sh% ~/ > tmp.txt 
sh% ~/ ls -l tmp.txt
-rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt
В zsh это идея, как всегда, более развита Ж:-) Существуют переменные окружения NULLCMD и READNULLCMD, по умолчанию установленные в cat и more соответственно. Что позволяет такие дополнительные возможности:
# аналог cat > tmp.txt. ничего не вводим, сразу жмем ctrl-d
# получаем файл нулевого размера.
ramok@~/ > tmp.txt  
^D
ramok@~/ ls -l tmp.txt 
-rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt

# аналог cat > tmp.txt. вводим то что нужно внести в файл и жмем ctrl-d
ramok@~/ > tmp.txt  
123
^D
ramok@~/ ls -l tmp.txt         
-rw-rw-r-- 1 ramok ramok 4 2007-06-09 11:33 tmp.txt

# аналог cat >> tmp.txt. вводим то что нужно добавить в файл и жмем ctrl-d
ramok@~/ >> tmp.txt  
456
^D
ramok@~/ ls -l tmp.txt         
-rw-rw-r-- 1 ramok ramok 8 2007-06-09 11:33 tmp.txt

# аналог more < tmp.txt
ramok@~/ < tmp.txt  
123
456

Естественно можно установить NULLCMD и READNULLCMD в свои значения, например в true и less соответственно. Или придумать что-нибудь лучшее Ж:-)

PS

и кой чего в нагрузку Ж:-) в шеллах есть встроенная команда :, аналог команда true, которую тоже можно использовать для создания/обнуления файлов более коротким способом, чем echo -n > файл:

ramok@~/ :> tmp.txt 
ramok@~/ ls -l tmp.txt 
-rw-rw-r-- 1 ramok ramok 0 2007-06-09 11:33 tmp.txt
    
Изображение пользователя ramok.

Расширенные возможности команды cd в zsh

Tags: •  • 
1.
ramok<~/soft/ cd -
ramok<~/tmp/ cd -
ramok<~/soft/
вернутся в предыдущую директорию. Очень удобно перескакивать туда обратно между двумя директориями. Это есть так же и в bash.
2.
ramok<~/soft/micq-0.5.1/ cd 1 2
~/soft/micq-0.5.2
ramok<~/soft/micq-0.5.2/ cd soft tmp
~/tmp/micq-0.5.2
ramok<~/tmp/micq-0.5.2
Если cd указать два аргумента, то в текущем пути будет найден первый аргумент, заменен на второй и в эту директорую будет сделан переход. Притом можно использовать автодополнение ко второму элементу(нажать [Tab] один или два раза, в зависимости от ваших настроек). zsh самостоятельно найдет все подходящие варианты и предложит вам.
ramok<~/soft/micq-0.5.2/ cd soft [TAB]
~/tmp/micq-0.5.2
ramok<~/tmp/micq-0.5.2

3.
ramok<~/ cd ~/soft/micq-0.5.1
ramok<~/soft/micq-0.5.1/ cd 1 2
~/soft/micq-0.5.2
ramok<~/soft/micq-0.5.2/ cd soft tmp
~/tmp/micq-0.5.2
ramok<~/tmp/micq-0.5.2/ cd -2
~/soft/micq-0.5.1
ramok<~/soft/micq-0.5.1/ cd +2
~/tmp/micq-0.5.2
ramok<~/tmp/micq-0.5.2/ dirs
~/tmp/micq-0.5.2 ~/soft/micq-0.5.1 ~/soft/micq-0.5.2 ~
ramok<~/tmp/micq-0.5.2/
если аргумент cd начинается с + или - и числа после них, то это будет интерпретировано как как относительный номер директории в стеке директорий в которых вы уже побывали и переход на эту директорию. так же это реализуется командами popd и pushd
Изображение пользователя ramok.

Удобное обращение к родительским каталогам в zsh

Tags: •  • 
Можно облегчить себе жизнь занеся в ~/.zshrc
setopt autocd
alias -g ...='../..'
alias -g ....='../../..'
alias -g .....='../../../..'
после чего можно ходить по каталогам не вводя 'cd' и упрощенное обращение к родительским каталогам
ramok<~/ work/ds/lib/logger
ramok<~/work/ds/lib/logger/ ....
ramok<~/work/ 
Изображение пользователя ramok.

Редактирование сложных команда в bash и zsh

Tags: •  •  • 

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

В 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

Изображение пользователя ramok.

Глобальные алиасы в zsh

Tags: •  • 
В zsh в дополнение к нормальным и суфиксным алиасам, существуют еще и глобальные алиасы. Они отличаются от обычных тем, что разварачивание алиаса происходит в любом месте командной строки, а не только в начале строки.
RSS-материал