19
июня
0

Командный процессор ZSH



ZSH — Shell, командная оболочка, командный интерпретатор или же командный процессор, принадлежащий к sh-совместимым, который имеет расширенные возможности и улучшения чем bash.

Шелл имеет расширенные возможности автодополнения, алиасов, перенаправлений ввода/вывода, глоббинг, модульную структуру. Грамматика команд по большей части совпадает с грамматикой других командных процессоров семейства bourne shell, хотя имеются различные расширения.

Zsh разработан в большей мере для интерактивного использования, но имеет много конфигурационных файлов для гибкой настройки во всех режимах оболочки:
интерактивной — когда запущен экземпляр программы после входа;
не интерактивной — для выполнения скриптов.
Также в работе удобно использовать горячие комбинации клавиш.

Zsh использует следующие конфиги в /etc/[file] и/или в /home/$USER/.[file]:

zshenv — считывается первым и содержит в себе настройки окружения (считывается при каждом запуске любого экземпляра zsh);
zprofile — считывается при входе пользователя в систему;
zshrc — считывается, если оболочка является интерактивной;
zlogin/zlogout — читаются при входе/выходе соответственно; и еще пару не столь важных, таких как ~/.zcompdump и ~/.zhistory.

Сначала применяються общесистемные профильные файлы в /etc, а потом из каталога пользователя. Все файлы не обязательно использовать, можно для своих нужд настроить парочку или лишь один zshrc. Например, zprofile и zlogin совместно использовать нет смысла.

ИМХО, лучше всего использовать /etc/zprofile для задания общих настроек, а потом ~/.zshrc для любого интерактивного экземпляра шелла.
После установки интерпретатора обычно можно найти его примеры конфигов, чем и займемся. К примеру, вот так:

 find /usr -type d -name 'zsh' 

Где можем найти много всего интересного. Наиболее достопримечательными и освоенными мной особенностями Zsh являются в .zshrc:

1. Глобальные алиасы (для конвейера с командой после него или чего-то еще, следующего не в начале вводимого в командной строке):

 alias -g G='|grep -i'
alias -g M='|more'
alias -g L='|less'
alias -g H='|head'
alias -g T='|tail'
alias -g N='2>/dev/null' #не выводить сообщения об ошибках на stdout(экран)

Пример:

 ls -alh M
#постраничный, реализованный more-м, вывод списка файлов в текущем каталоге 

2. Запуск файлов какой-то программой в зависимости от его «расширения» (в мире UNIX нет понятия расширение файла, можно посмотреть тип файла командой file):

 alias -s {avi,mpeg,mpg,mov,m2v}=mplayer
alias -s {odt,doc,sxw,rtf}=openoffice.org
alias -s avi=mplayer #команда movie.avi будет расширена до mplayer movie.avi 

3. Zsh имеет модульную структуру и можно «подгрузить» много полезностей.
Очень удобным является расширенное автоматическое дополнение команд, когда TAB-ом можно узнать опции какой-либо команды. Для объявления автоматически загружаемой функции используется встроенная команда autoload в .zshrc:

autoload -U compinit
compinit #  расширенные возможности автодополнения 

4. За внешний вид приглашения отвечает переменная PROMPT (а не PS1, как в bash!). В zsh уже существуют готовые решения вида приглашения командного интерпретатора и можно подобрать себе, что душе угодно и подправить немного для полной гармонии с шеллом  одгружаем:

 autoload promptinit
promptinit 

смотрим что есть:

 prompt -p 

и ставим, что понравилось:

 prompt tema 

5. Zsh позволяет производить рекурсивное раскрытие имен файлов. Для этого используются формы **/ и ***/. ***/ — следует по символьным ссылкам.
К примеру, если у вас есть в хомяке в каком-то каталоге файл с названием bar.txt, то:

cd ~ ; cat **/bar.txt 

покажет его содержимое.Настроить среду и поведение оболочки также с помощью специальных переменных, применять/отменять их встроенными в шелл командами setopt и unsetopt.

6. globbing — генерация имен файлов. Кроме стандартных, таких как *, ?, […], можно использовать дополнительные:

 setopt extendedglob 

7. autocd — отказываемся от использования команды «cd».

К примеру, использовать для замены алиасов:

alias ..='cd ..;'
alias ...='cd ../../;' 

и тому подобного или просто ходить по директориям без «cd».

 setopt  autocd 

8. histignoredups и histignorespace — избавляемся от пробелов и дубликатов в истории команд. Для того чтобы каждая введенная в оболочке команда сохранялась в списке выполненных команд, нужно задать следующие переменные окружения под свои нужды:

 HISTSIZE=1024
SAVEHIST=1024
HISTFILE=~/.zsh_history 

Zsh не читает /etc/inputrc, в отличие от bash, поэтому есть большая вероятность, что клавиши подобные DELETE, HOME, END могут не работать. Это все решаемо. Сочетанием клавиш Ctrl-v Home в терминале можно посмотреть символы, «отвечающие» за клавишу Home и так далее по аналогии. То, что отобразится после этого можно использовать для задания поведения:

 bindkey "^[[7~" beginning-of-line 

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

/etc/profile:

 export PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin"
export PAGER="less"
export EDITOR="vim"
export LANG="ru_RU.KOI8-R"
export MYSQL_PS1="<\R:\m:\s>\U[\d](\c)\n>\_"
#export MANPAGER="/usr/bin/most -s" # если есть такой пакет, для подсветки man-страниц
if test $TERM = 'xterm'; then precmd () {print -Pn "\e]0;%n@%m: %~\a"}; fi 

~/.zshrc:

</pre>
PS1="$(print '%{\e[0;35m%}&lt;%T&gt;%{\e[1;32m%}[%{\e[0;37m%}%n@%m%{\e[0;37m%}:%{\e[0;32m%}%33&lt;..&lt;%~%{\e[1;32m%}]%{\e[0;37m%}%(!.#.$)%{\e[0m%} ')"
#
alias tf='tail -f'
alias en='sudo -s'
alias top='top -s 1'
alias df='df -h'
alias l='ls -GalFh'
alias ls='ls -GFh'
alias la='ls -GaFh'
alias ll='ls -GlAFh'
alias lsd='ls -lhd *(-/DN)' # показать только директории в каталоге
alias lsa='ls -lhd .*' # вывести список файлов начинающихся с точки (скрытых файлов)
alias sr='screen -r'
alias sl='screen -ls'
alias sx='screen -x'
alias sc='screen'
alias p='ping'
alias bc='bc -ql'
alias v='vim'
alias vr='vim -R'              # запустить в режиме «только чтение»
alias grep='grep --color=tty'          # подсвечивать найденный шаблон
alias C='cd -'           # возврат на предыдущий каталог
alias logs='cat /var/log/messages | grep'
alias pi='ping -i0.2 -c100 -s1000'
alias da='dig any'
alias h='history'
#
GREP_COLOR='0;33'
MC_COLOR_TABLE=:normal=gray,default:markselect=brightred,
yellow:marked=brightred, default:directory=brightblue, default:executable=brightgreen,default:link=default,default
#
autoload -U compinit
compinit
setopt extendedglob autocd  histignoredups histignorespace
#
bindkey "^[[2~" yank
bindkey "^[[3~" delete-char
bindkey "^[[5~" up-line-or-history
bindkey "^[[6~" down-line-or-history
bindkey "^[[1~" beginning-of-line
bindkey "^[[4~" end-of-line
bindkey "^[e" expand-cmd-path ## C-e for expanding path of typed command
bindkey "^[[A" up-line-or-search ## up arrow for back-history-search
bindkey "^[[B" down-line-or-search ## down arrow for fwd-history-search
bindkey " " magic-space ## do history expansion on space
# history
HISTFILE=~/.zsh_history
# дополнение после каждого сеанса
setopt  APPEND_HISTORY
# не дописывать команды, что повторяются
setopt  HIST_IGNORE_ALL_DUPS
# игнорировать лишние пpoбeлы
setopt  HIST_IGNORE_SPACE
# удалять из файла истории пустые строки
setopt  HIST_REDUCE_BLANKS 
Понравилась статья?
Подписаться на RSS feed
Оставить комментарий