Пользователь
0,0
рейтинг
12 декабря 2012 в 15:04

Администрирование → zsh и bash: что выбрать из песочницы

Для тех, кто ещё не знаком с Z Shell, а так же тем, кто находится на распутье в выборе шелла для повседневных задач, посвящается эта заметка.
Надо сказать, о преимуществах zsh написано уже достаточно много материалов. Что касается этой скромной заметки, она призвана показать читателю возможности обеих оболочек на конкретных примерах конфигурационных файлов. Упор сделан таки на zsh, ибо в понимании автора bash, как правило, пригоден к использованию изначально, zsh без собственных настроек лучше не использовать вовсе.
Полные конфигурационные файлы автора можно забрать с github.

I. Лучшее в shell — автодополнение

Автодополнение есть и в bash, этим в наше время никого не удивишь. Особенно хорош в этом смысле bash-completion, который позволяет дополнять не только пути к каталогам, но и эффективно искать пакеты для установки. Если вы ранее не использовали его, мой вам совет: обязательно установите. Дополнительных настроек для работы этого пакета не требуется.

Zsh может удивить вас, это действительно так. Пожалуй, автодополнение — одна из его сильнейших сторон. Сразу же нужно отметить тот факт, что zsh является модульным и для расширения его возможностей необходимо подключить или в некоторых случаях установить нужные модули. Кроме того, без индивидуальной настройки в zsh не обойтись: модули нужно будет включить в ваш .zshrc. Обратимся к практическим примерам.
Для ArchLinux лучше сразу установить пакеты, подобные bash-completion, что позволит использовать автодополнение в поиске пакетов с pacman и AUR: это zsh-yaourt и zsh-packer. Найти их можно в том же AUR. Подключим наше автодополнение:

#Включить автодополнение 
autoload -U compinit promptinit 
compinit
promptinit
# Для pacman
[[ -a $(whence -p pacman-color) ]] && compdef _pacman pacman-color=pacman
# Корректировка ввода
setopt CORRECT_ALL
# Если в слове есть ошибка, предложить исправить её
SPROMPT="Ошибка! ввести %r вместо %R? ([Y]es/[N]o/[E]dit/[A]bort) "
# Не нужно всегда вводить cd
# просто наберите нужный каталог и окажитесь в нём
setopt autocd
# При совпадении первых букв слова вывести меню выбора
zstyle ':completion:*' menu select=long-list select=0
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}


Уже неплохо, верно? Честно сказать, меня не прельщала перспектива перехода на zsh, поскольку в целом устраивал и bash. Но эксперимент показал: zsh — это очень удобно.

II. Горячие клавиши
Насколько мне известно, в bash горячие клавиши изменению не подлежат. Впрочем, не исключено, что я ошибаюсь. Это известные всем линуксоидам клавиши редактора emacs. Они взяты за основу и будут работать на любой машине, где установлен bash. Конечно, никто не запретит вам использовать стрелки для перемещения между символами или клавишу delete для удаления символа — это тоже есть в bash, и это тоже не нужно настраивать.

Обратимся к zsh. Да, как вы уже, наверное, догадались: в zsh всё нужно настроить под себя. Разумеется, было бы жутко, если бы нам пришлось настраивать каждую клавишу — вовсе нет! Можно выбрать один из двух стилей, ориентируясь на более привычный вам: режим vi или режим emacs.
Рекомендация: выбирайте emasc, чтобы уверенно пользоваться горячими клавишами на любой машине с любым shell'ом, кроме того, наиболее популярен всё таки bash — ориентируйтесь на него.
Разумеется, можно настроить отдельные сочетания клавиш так, как вам нравится.
Пример:

bindkey '\e[3~' delete-char # del
bindkey ';5D' backward-word # ctrl+left
bindkey ';5C' forward-word #ctrl+right


III. Алиасы
Очень удобно бывает использовать алиасы различных команд. Алиасы замечательно настраиваются как в bash, так и в zsh. Отличие в том, что в zsh можно использовать не только команды, но и назначить расширения типов файлов для отдельных приложений. Чем это полезно? Благодаря этой возможности zsh может заменить вам даже файловый менеджер. Смотрите сами:

# Aliases
alias ls='ls --color=auto'
alias grep='grep --colour=auto'
alias -s {avi,mpeg,mpg,mov,m2v}=mplayer
alias -s {odt,doc,sxw,rtf}=openoffice.org
autoload -U pick-web-browser
alias -s {html,htm}=chromium


Обратите внимание на строки, начинающиеся с alias -s. Теперь представьте: вы находитесь в директории с документами и среди них есть один или несколько с расширением .html. Что мы делаем обычно? Запускаем браузер, жмём Ctrl+O, выбираем файл и просматриваем его. Что позволяют сделать алиасы в zsh? Просто напишите название документа и он тут же будет открыт в браузере.
Для этого сначала подгружается отдельный модуль pick-web-browser

IV. История команд
И уж, конечно, ни один пользователь не оспорит удобство использования истории команд. Здесь zsh ничем особенным не отличается от bash. Настроим его:

#  History
# хранить историю в указанном файле
export HISTFILE=~/.zsh_history
# максимальное число команд, хранимых в сеансе
export HISTSIZE=1000
export SAVEHIST=$HISTSIZE
# включить историю команд
setopt APPEND_HISTORY
# убрать повторяющиеся команды, пустые строки и пр.
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_IGNORE_SPACE
setopt HIST_REDUCE_BLANKS


V. Прочие удобства
Для zsh есть одна прелюбопытнейшая вещь: плагин zsh-syntax-highlighting. Пользователи ArchLinux могут установить его из AUR, остальные — скачать из одноимённого проекта на github. Поставьте его, и ваш эмулятор терминала заиграет новыми красками.
Изначально он ориентирован на любые терминалы — не только поддерживающие 256 цветов, поэтому некоторые цвета могут выглядеть не так, как нам нравится, но это можно исправить. Главный файл с настройками цветов располагается по пути:
/usr/share/zsh/plugins/zsh-syntax-highlight/highlighters/main/main-highlighter.zsh. Но править непосредственно его нет нужды (спаибо, ZyXI за указание на ошибку).
Измените цвета так, как вам нужно в .zshrc и активируйте плагин.
Пример:

# zsh-syntax-highlighting from AUR
typeset -A ZSH_HIGHLIGHT_STYLES
ZSH_HIGHLIGHT_STYLES=(
        'alias'           'fg=153,bold'
        'builtin'         'fg=153'
        'function'        'fg=166'
        'command'         'fg=153'
        'precommand'      'fg=153, underline'
        'hashed-commands' 'fg=153'
        'path'            'underline'
        'globbing'        'fg=166'
)

source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh



Также в zsh имеется очень популярный способ запаковки/распаковки архивов. Введите команду extract myfile.tar — распакуете архив, введите команду pk tar myfile — запакуете файл в архив указанного формата. Выходит, zsh может заменить архиватор?

Для распаковки впишем в .zhsrc:

# Распаковка архивов
# example: extract file
extract () {
 if [ -f $1 ] ; then
 case $1 in
 *.tar.bz2)   tar xjf $1        ;;
 *.tar.gz)    tar xzf $1     ;;
 *.bz2)       bunzip2 $1       ;;
 *.rar)       unrar x $1     ;;
 *.gz)        gunzip $1     ;;
 *.tar)       tar xf $1        ;;
 *.tbz2)      tar xjf $1      ;;
 *.tbz)       tar -xjvf $1    ;;
 *.tgz)       tar xzf $1       ;;
 *.zip)       unzip $1     ;;
 *.Z)         uncompress $1  ;;
 *.7z)        7z x $1    ;;
 *)           echo "I don't know how to extract '$1'..." ;;
 esac
 else
 echo "'$1' is not a valid file"
 fi
}


Для создания архивов:

# Запаковать архив
# example: pk tar file
pk () {
 if [ $1 ] ; then
 case $1 in
 tbz)       tar cjvf $2.tar.bz2 $2      ;;
 tgz)       tar czvf $2.tar.gz  $2       ;;
 tar)      tar cpvf $2.tar  $2       ;;
 bz2)    bzip $2 ;;
 gz)        gzip -c -9 -n $2 > $2.gz ;;
 zip)       zip -r $2.zip $2   ;;
 7z)        7z a $2.7z $2    ;;
 *)         echo "'$1' cannot be packed via pk()" ;;
 esac
 else
 echo "'$1' is not a valid file"
 fi

}   


VI. Итоги
Zsh очень удобен для повседневной работы и делает добрую половину рутины за вас. Но стоит обратить внимание на различия между этими двумя оболочками. Например, в zsh после for обязательно вставлять пробел, нумерация массивов в zsh начинается с 1, чего совершенно невозможно понять.
Так, если вы используете shell для повседневной работы, исключающей написание скриптов, используйте zsh. Если вам часто приходится писать свои скрипты, только bash! Впрочем, можно комбинировать.
Как установить zsh в качестве оболочки по-умолчанию для отдельного пользователя:

$ chsh -s /bin/zsh your_user
@Beretta
карма
11,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (124)

  • +3
    за zsh-syntax-highlighting спасибо!
    не подскажите как им вводимую команду разукрасить? а то до нажатия на бэкспейс не хочет раскрашивать.

    К слову сказать, горячие клавиши в баше имеются (bind, а узнать код клавиши можно через read. так же в обоих шелах можно выставить vi mode — set -o vi ), но вот хоткееев с префиксами в баше кажется нет…
    распаковка архивов аналогична и для баша, выкидывание повторений и прочего хлама из истории в баше тоже имеется
    • 0
      grc
      — .zshrc — if [ -f /usr/bin/grc ]; then
      alias ping=«grc --colour=auto ping»
      alias traceroute=«grc --colour=auto traceroute»
      alias make=«grc --colour=auto make»
      alias diff=«grc --colour=auto diff»
      alias cvs=«grc --colour=auto cvs»
      alias netstat=«grc --colour=auto netstat»
      fi
      • 0
        о grc вкурсе, но здесь совсем другая тема — подсвечивает текущую команду (к примеру, красным несуществующую, зеленым существующую) и прочее…
  • +1
    Выходит, zsh может заменить архиватор?


    Это простейшая функция. Даже близко не архиватор.

    Насколько мне известно, в bash горячие клавиши изменению не подлежат. Впрочем, не исключено, что я ошибаюсь. Это известные всем линуксоидам клавиши редактора emacs. Они взяты за основу и будут работать на любой машине, где установлен bash.


    Тоже можно включить vi-like режим.

    В случае с bash, надо создать файл ~/.inputrc и добавить в него следующее:

        set editing-mode vi
        set keymap vi
    


    • 0
      Это простейшая функция. Даже близко не архиватор.
      перефразирую, эти две функции унифицируют некоторый функции разных упаковщиков/распаковщиков (почти как atool)
      • –1
        … и работают в bash тоже.
    • 0
      … или же переопределить клавиши вручную, почти так же (совсем так же?) как и в zsh.
      • 0
        И в каждом терминале затем каждый раз писать set -o vi?
        • 0
          Зачем?! Вы в zsh в каждом терминале пишете вышеупомянутое?
          • 0
            Затем, что если в конфиге нигде ничего нет про vi-like режим, то нужно в каждом новом терминале (сессии) заново это писать.
            • 0
              Ой ли? В zsh так же «в конфиге нигде ничего нет про vi-like режим».
    • 0
      Я вот пробовал включать vi режим. Жутко неудобно. Полчаса искал как же теперь делать поиск, который раньше был на ctrl-r.
      • 0
        Согласен. Предпочитаю emacs с кучей заимствований из vim (не из vi режима), включая <C-r>+/<C-r>*, <C-o>+некоторые операторы. Теперь жалею, что такого нет в самом vim (командный режим там на редкость убог по сравнению с zsh, но не с bash).
  • 0
    не подскажите как им вводимую команду разукрасить? а то до нажатия на бэкспейс не хочет раскрашивать.
    вставил после определения цветов и наступила благодать
  • НЛО прилетело и опубликовало эту надпись здесь
    • +3
      А ещё лучше /usr/bin/env python :)
      • 0
        Ага, а в арче это — python3, для второго надо /usr/bin/env python2
    • 0
      С чего бы? Портабельность не аргумент (лично для меня), так как скрипты пишу для себя.
    • 0
      эм, насколько я знаю во многих системах — /bin/sh -> алиас к /bin/bash
      • +2
        А в debian, насколько я помню, к /bin/dash. Может уже изменили, но раньше такое точно было. Судя по списку файлов данного пакета — так и не изменили.
  • +1
    Что-то мало как-то всего. Я ожидал чего-то большего. Ну и я просто оставлю это здесь.
    • 0
      Спасибо, пригодится. Мой переход на zsh состоялся не так давно, предпочитаю наращивать функциональность по мере надобности. Пока большего не нужно.
  • +19
    A где упоминание oh-my-zsh? Из разряда must have.
    • 0
      Да без oh-my-zsh zsh не zsh!
    • 0
      Да, либо oh-my-zsh, либо grml,. Конфигурировать zsh с чистого листа — это для сильных духом.
      Меня grml полностью устраивает, с oh-my-zsh как-то не срослось, хотя он и более гибкий.
      • 0
        Расскажите, пожалуйста про grml и его отличия от oh-my-zsh. Сижу на oh-my-zsh, но любопытно стоит ли мигрировать?
        • 0
          oh-my-zsh модульный и сильно кастомизируемый, а grml просто хорошо вылизанный конфиг. Я два раза пытался пересесть на oh-my-zsh, но оба раза не сумел его настроить так, что бы он не выглядел аляповато и был так же удобен. К сожалению, сейчас я уже не вспомню, что конкретно меня не устроило.

          Попробуйте, это же не систему переставить. Не понравится — вернётесь.
    • 0
      Специально залогинился чтобы написать про это :) сам использую, но грешу тем, что половины функционала не знаю. Просто установил, чуть подкрутил тему оформления и всё.

      А вот строчки из примера про zsh-syntax-highlighting, не заработали :(
      • 0
        ibex, а ваш терминал понимает 256 цветов? Укажите ему это, затем в файле настроек измените значения на свои, используя хотя бы вот эту таблицу цветов. Выходим из терминала и снова входим в него, всё должно работать.
        • 0
          Спасибо, почитаю на досуге. Пока не вникал в детали, но grc и просто разукрашенный вывод работает.
          • 0
            zsh — это в первую очередь удобство повседневного использования. Если вам удобен вывод с grc, просто используйте его и не заморачивайтесь. А если нет времени настраивать под себя, то grml или oh-my-zsh и правда лучший выбор.
  • 0
    zsh без собственных настроек лучше не использовать вовсе.

    Вот оно чо! Несколько раз пытался использовать zsh, но как-то особых плюсов не нашёл, что-то удобней, что-то нет, а в ubuntu как-то показалось, что zsh из коробки меньше команд знает, чем bash-competitions, а аналогичного пакета не нашёл.
    • +1
    • +1
      Я поставил oh-my-zsh, потом включил в нём тему «random», чтобы каждый раз бралась новая (а там их более сотни) — и оно меня теперь радует.

      О многих возможностях prompt'а (которые реально удобны!) я даже не подозревал.
  • 0
    Например, в zsh после for обязательно вставлять пробел, нумерация массивов в zsh начинается с 1, чего совершенно невозможно понять.
    Так, если вы используете shell для повседневной работы, исключающей написание скриптов, используйте zsh. Если вам часто приходится писать свои скрипты, только bash!

    сколько пробовал всякие скрипты запускать, работало нормально, если в скрипте прописать #!/bin/bash. Например, скрипт:
    #!/bin/bash
    
    w=("I" "like" "archlinux")
    for((i=0; i < 3; i++))
    do
      echo ${w[$i]}
    done

    Вполне корректно работает, если запускать из-под zsh.
    • +1
      > работало нормально, если в скрипте прописать #!/bin/bash

      Юникс-сообществом башизмы порицаются.
      • 0
        Только /bin/sh, только хардкор?
        • 0
          Вы так говорите это, как будто бы так сложно писать на sh.
          • 0
            Несложно. Но zsh дает вам больше возможностей.
            • –1
              Зачем?
              • –1
                Это позволяет мне работать комфортнее и быстрее.
                • –1
                  Засчёт тех, кто будут ваши скрипты, мучаясь, запускать. Нет уж, спасибо.
                  • 0
                    Засчёт тех, кто будут ваши скрипты, мучаясь, запускать.
                    Додумывать за меня ваше хобби или случайно получилось?
                    Мысль о том, что скрипты пишутся не только для кого-то, но и для решения собственных задач видимо вас не посещала.
                    • –1
                      Ну понятно, да. Write-only style. Мысль о том, что Ваши скрипты, возможно, кому-то пригодятся и будут использоваться, видимо, Вам не посещала. Это только другие — вот же ж дураки! — пишут скрипты, которыми пользуются тысячи. И поделом им, пусть дальше пишут на POSIX shell.
                      • –1
                        Мысль о том, что Ваши скрипты, возможно, кому-то пригодятся и будут использоваться, видимо, Вам не посещала
                        «Собственные задачи», вам эта фраза хоть о чем-то говорит?

                        По вашей логике в мире должен быть один единственный «язык программирования». Отвечать на остальное — это скатываться во флейм и троллинг.
            • 0
              Какой смысл писать скрипты, которые будут работать у меня и ещё двух с половиной человек?
              • 0
                habrahabr.ru/post/162339/#comment_5578123
                Фразу про суслика помните?
              • –1
                Примерно такой же, как писать на пейтоне, которого в стандартной поставке LTS обычно нет.

                Давайте уж тогда и от библиотек откажемся, заодно. Правда, ассемблер и коды тоже не панацея, обязательно придумают какой-нибудь mainframe.

    • +2
      Просто он запускается из-под баш на самом деле. zsh запускает bash и передаёт ему скрипт параметром. По крайней мере должен, если zsh не включает какой-то режим совместимости вопреки явному указанию интерпретатора в скрипте.
    • 0
      Нет, не работает. Запускать надо используя zsh scriptname, иначе запуститься bash. Зато в zsh работает
      for ((i=0; i<3; i++)) {
          echo $i
      }
  • +1
    на многих коммерческих проектах обычно используется The Korn Shell. хотя он и старый, и в нем нет многих красот, но он существует под все Unix платформы и это его главное преимущество
    • 0
      Bourne/POSIX shell, если уж говорить о многоплатформенности.
    • 0
      Кстати, пользуюсь mksh, да.
  • +1
    ># включить историю команд
    >setopt APPEND_HISTORY
    Разбавили статью переводческим юмором, молодец.

    У меня по zsh другой вопрос — как имитировать поведение опции cdspell из баша?
    Там при указании неправильного пути шелл сам молча исправляет путь, не отвлекая меня вопросами Да/Исправить/Отмена.
    Т.е. если я в спешке ввёл /otp, то хотелось бы чтобы шелл молча перекинул меня в /opt
    Это отдельная опция, не связанная с автокомплитом, так что про него писать не надо.
    • 0
      phikus
      как имитировать поведение опции cdspell из баша?
       shopt -s cdspell
      
      • 0
        что это за опция?
        • 0
          Исправляет опечатки, если может.
          Например по cd /avr/logs автоматически перейдет в /var/log.
          • 0
            /home/mulder/.zshrc:71: command not found: shopt
            > apt-cache search shopt
            >

            нету в дебиане такого
            • 0
              как имитировать поведение опции cdspell из баша?

              /home/mulder/.zshrc


              К. О. спешит сообщить, что пробовать использовать shopt имеет смысл в баше.
            • 0
              foxmuldercp, извините, ступил, это опция для bash'a, a не zsh.
              zsh, ЕМНИП, так не умеет.
              • 0
                Ну конечно, не умеет, ага

                # list of completers to use
                zstyle ':completion:*::::' completer _expand _complete _ignored _approximate

                # allow one error for every three characters typed in approximate completer
                zstyle -e ':completion:*:approximate:*' max-errors \
                'reply=( $(( ($#PREFIX+$#SUFFIX)/3 )) numeric )'

                А ещё вот так умеет:
                tail -f /v/l/a
                экспандится в
                tail -f /var/log/all.log

                Конечно, если экспанд однзначный.
                Если нет — спросит, предложит варианты.

                Вобщем, man zshall — там много вкусного: и про approximate, и про всё остальное тоже.
                • 0
                  >Ну конечно, не умеет, ага
                  Исправляет с запросом. Вы читали мой вопрос? cdspell в баше видели?
                  Если в вопросе не волокёшь, то не надо информационный шум создавать, посидите, почитайте молча, что умные люди пишут
                • 0
                  cubuanic
                  Ну конечно, не умеет, ага
                  Оно меняет, но по табу, а cdspell в баше меняет автоматом.
                  А ещё вот так умеет:
                  tail -f /v/l/a
                  экспандится в
                  tail -f /var/log/all.log
                  Это называется globbing, вещь крутейшая.
                  Но работает также по табу. Введя
                  tail -f /v/l/a
                  
                  и нажав enter без таба вы получите
                  tail: /v/l/a: No such file or directory
                  
  • 0
    Спасибо за статью.

    > Запускаем браузер, жмём Ctrl+O, выбираем файл и просматриваем его.

    Ну это Вы преувеличили… $ app
    • +1
      Или так:
      # linux/bsd
      xdg-open <file>
      
      #macosx
      open <file>
      
      # можно еще алиасы настроить
      alias xo='xdg-open'
      alias sxo='sudo xdg-open'
      

  • +2
    Кстати, по поводу небольших плюшек в .zshrc. Вставлю и я свои пять копеек.
    zstyle ':completion:*' insert-tab false         # Автокомплит для первого символа
    
    # pkgfile - только для Арча. При установленном pkgfile
    source /usr/share/doc/pkgfile/command-not-found.zsh
    
    # я не пользуюсь bindkeys -e, у меня все свое
    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 ';5D' backward-word                     # ctrl+left 
    bindkey ';5C' forward-word                      # ctrl+right
    bindkey '\e[1~' beginning-of-line               # home
    bindkey '\e[2~' overwrite-mode                  # insert
    bindkey '\e[3~' delete-char                     # del
    bindkey '\e[4~' end-of-line                     # end
    bindkey '\e[5~' up-line-or-history              # page-up
    bindkey '\e[6~' down-line-or-history            # page-down
    • +2
      Извиняюсь, нужно было прокомментировать. Дело в том, что zsh умеет делать автокомплит из истории по команде. Например, если я вводил vim ~/.zshrc ранее, то потом я могу ввести только vim, нажать кнопку вверх и он сам мне подставит продолжение строки из истории. Кнопки page-up, page-down служат привычной навигацией по истории. Назначение всех других клавиш в общем то достаточно понятно.

      Манипуляции с pkgfile тоже довольно понятны арчеводам — если я пытаюсь запустить бинарник, которого содержится в неустановленном пакете, то мне zsh подскажет, где этот бинарник можно найти.
  • 0
    мой конфиг
    дополняет хосты из списка при попытке подключения по ssh,
    раскрашивает grc некоторые команды
    и еще куча плюшек алиасами
    .zshrc
    autoload -U compinit
    compinit -C
    zstyle ':completion:*' menu yes select
    hosts=(example.com example.net example.org)
    zstyle '*' hosts $hosts
    #hosts=(`cat ~/.ssh/known_hosts | tr, " " | awk '{ print $1 }'`)
    #zstyle '*' hosts $hosts
    #zstyle ':completion:*:(ssh|scp):*:users' ignored-patterns `cat /etc/passwd | awk -F ":" '{ if($3<1000) print $1 }'\
    zstyle ':completion:*:processes' command 'ps xua'
    zstyle ':completion:*:processes' sort false
    zstyle ':completion:*:processes-names' command 'ps xho command'
    zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'
    eval `dircolors`
    alias ls='ls --color=auto'
    zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
    export GREP_OPTIONS='--color=auto'
    export GREP_COLOR='1;32'

    if [ -f /usr/bin/grc ]; then
    alias ping=«grc --colour=auto ping»
    alias traceroute=«grc --colour=auto traceroute»
    alias make=«grc --colour=auto make»
    alias diff=«grc --colour=auto diff»
    alias cvs=«grc --colour=auto cvs»
    alias netstat=«grc --colour=auto netstat»
    fi

    autoload promptinit
    promptinit
    prompt walters

    #PS1='%T %m%# '
    #PS2='> '
    #RPROMPT='%~'

    case $TERM in
    xterm*|rxvt)
    precmd () { print -Pn "\e]0;%n@%m: %~\a" }
    preexec () { print -Pn "\e]0;%n@%m: $1\a" }
    ;;
    screen)
    precmd () { print -Pn "\033k%~\033\\" }
    preexec () { print -Pn "\033k$1\033\\" }
    ;;
    esac
    if [ -d ~/bin ]; then
    PATH=~/bin:"${PATH}"
    fi

    setopt autocd
    setopt extended_glob
    setopt correct

    alias sdr=«screen -aAdr»
    alias la=«ls -A»
    alias ll=«ls -lA»
    alias grep='grep --exclude="*.svn*"'

    alias mkpasswd=«head -c16 /dev/urandom | xxd -ps»
    fix_mp3() { find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1 }
    mpg2flv() { ffmpeg -i $1 -ar 22050 -ab 32 -f flv -s 320x240 `echo $1 | awk -F. '{print $1}'`.flv }
    mcd() { mkdir $1; cd $1 }
    newday() { mcd `date +%F` }
    #c() { awk "{ print \$$1 }" }
    #svnid() { svn propset svn:keywords "Author Date Id Revision" $1 }
    #ignore() { svn propedit svn:ignore. }

    bindkey "^[[1~" beginning-of-line
    bindkey "^[[4~" end-of-line

    • 0
      foxmuldercp, в oh-my-zsh есть плагин, который строит дополнение хостов по содержимому ~/.ssh/known_hosts.
      • +1
        в современных вариантах известные хосты в хешах и нечитаемом виде в этом файле лежат, посему такое менюшко местами лучше, чем лезть в конфиг ssh и править отображение этого файлика в другом формате
        • 0
          в современных вариантах известные хосты в хешах и нечитаемом виде в этом файле лежат
          Честно говоря никогда не обращал внимание, но у меня хосты в ~/.ssh/known_hosts вполне читаемы.
          Это из коробки такой функционал или сами что-то докручивали?
          • 0
            По умолчанию в последних версиях дебиана такое было, напарывался несколько раз, потом товарищ посоветовал сделать такое меню, собственно его конфигом и пользуюсь.
            Правда у меня хоты обычно в putty забиты, с сервера на сервер я обычно только scp файло передаю.
    • 0
      Собственно вот:
      # use /etc/hosts and known_hosts for hostname completion
      [ -r /etc/ssh/ssh_known_hosts ] && _global_ssh_hosts=(${${${${(f)"$(</etc/ssh/ssh_known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _global_ssh_hosts=()
      [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
      [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
      hosts=(
        "$_global_ssh_hosts[@]"
        "$_ssh_hosts[@]"
        "$_etc_hosts[@]"
        "$HOST"
        localhost
      )
      zstyle ':completion:*:hosts' hosts $hosts
      
  • 0
    Кроме более хитрого автодополнения в bash всё перечисленное делается так же или чуть-чуть сложнее.
    То есть даже автооткрытие файлов по типу можно сделать через command_not_found_handle.
    Да и bash обычно уже поставлен, а zsh ставить надо.

    Что, однако, не отменяет годности zsh.
    • 0
      bash отличная оболочка, но эксперимента ради можно поставить zsh. В последнем, кстати, можно иначе работать с перенаправлением ввода. Например, без cat вывести содержимое файла:

      ~ % < file.sh
      #!/bin/bash
      
      w=("I" "like" "archlinux")
      for((i=0; i < 3; i++))
      do
        echo ${w[$i]}
      done
      

      bahs так не умеет, хотя это в сущности мелочи, но вводить с клавиатуры приходится меньше ;)

      • 0
        Это по-моему не cat, а less.
        • 0
          cat выводит содержимое файла целиком, less — постранично. В данном случае первое.
          • 0
            Уверены? Лично у меня < file пускает file на less.
            • 0
              Да less это. Просто пример слишком короткий, поэтому разницы между cat и less нет (практически).
              • 0
                У меня пускает more. Причём даже на /dev/null, который имеет нулевой размер. В документации это описано как «shows the contents of file on standard output, with paging if that is a terminal.», ни слова о том, какая программа делает paging или как это настроить.
                • 0
                  $ echo $PAGER
                  /usr/local/bin/less
                  
                  • 0
                    Вы думаете, у меня не less в $PAGER?
                    • 0
                      А, ок, увидел ваш эксперимент внизу.
            • 0
              Ваша правда, объёмный файл мне пустило в постраничный вывод
              • 0
                less приблизительно тоже самое что more
                • +1
                  less > more :)
            • 0
              это от переменной PAGER зависит, у меня вот most, а в некоторых скриптах cat
              • 0
                Эксперимент показывает, что нет.
                (zyx-desktop:zyx:~/.vam/powerline) % strace -e 'execve' zsh -c 'export PAGER=/usr/bin/less; < /dev/null'
                execve("/bin/zsh", ["zsh", "-c", "export PAGER=/usr/bin/less; < /d"...], [/* 64 vars */]) = 0
                execve("/bin/more", ["more"], [/* 64 vars */]) = 0
                +++ exited with 0 +++
                • +1
                  извиняюсь. у меня просто READNULLCMD=${PAGER}, так что зависит от $READNULLCMD
                  • 0
                    Самое интересное, что эта переменная упомянута и в предложении до, и в предложении после процитированного мною ранее.
      • 0
        Вводить меньше всего на одну клавишу («Shift»+«<» vs «c», «a», «t»). Проще настроить alias, особенно учитывая, что в dvorak «a» единственная находится под левой рукой (то есть имеем оптимальную последовательность правая‐левая‐правая, причём две клавиши в основном ряду, в отличие от Shift и <).
    • +2
      Заточить можно все, это правда. Но с появлением «oh-my-zsh» zsh вдруг оказался впереди по ключевому признаку: из коробки есть все, что нужно. Я давно не смотрел на баш, но, вроде бы, он не сумеет из коробки рассказать мне в PS1 про мой git и rvm. А zsh рад стараться:


      Обратите внимание на бранч и статус гита в промпте, и на текущий набор рубигемов.
      • 0
        Это смотря что подразумевается под из коробки:
        image
        Пара строчек source и еще две на добавление rvm-prompt и __git_ps1
        • 0
          Под «из коробки» подразумевается «накатил, поехал» ;-)

          Я умею git clone MYSETTINGS, да. Но это нужно гит сначала накатить, или из дропбокса вытаскивать и распаковывать…

          Но в целом, я согласен, что разницы особой нет (кроме таб-таб, конечно). Привычка — сильнее разницы.
    • +1
      поэтому на bash — скрипты, а в zsh — работать
      • 0
        Дело вкуса, конечно, но мне лично удобно, когда скрипт — ровно то, что я бы набирал в консоли + некоторые вещи вроде function()
  • +1
    II. Горячие клавиши

    Это не просто горячие клавиши, а, скорее, целая система ввода. Bash (и многие другие CLI-программы) использует GNU readline, zsh — встроенную zle. Обе системы поддерживают emacs и vi-стили и переназначение команд редактирования.
    • 0
      А кроме того — переназначение предустановленных значений.
  • +2
    меня устраивает bash и я не интересуюсь другими *sh.
    ЧЯДНТ?
    • +3
      Все правильно делаете.
      Устраивает bash – пользуйтесь на здоровье.
    • +1
      ЧЯДНТ?
      Не интересуетесь
  • 0
    Раз уж зашёл разговор о раскрашивании
    cat_via_pygmentize() {
        if [ ! -x $(which pygmentize) ]; then
            echo package \'pygmentize\' is not installed!
            exit -1
        fi
    
        if [ $# -eq 0 ]; then
            pygmentize -g $@
        fi
         
        for FNAME in $@
        do
            filename=$(basename "$FNAME")
            lexer=`pygmentize -N \"$filename\"`
            if [ "Z$lexer" != "Ztext" ]; then
                pygmentize -l $lexer "$FNAME"
            else
                pygmentize -g "$FNAME"
            fi
    
        done
    }
    
    alias o='cat_via_pygmentize'
    


    Подсвечивает абсолютно любой вывод
  • +3
    И уж, конечно, ни один пользователь не оспорит удобство использования истории команд. Здесь zsh ничем особенным не отличается от bash.

    Ну вы забыли две достаточно приятных особенности:
    1) up-line-or-search: поиск в истории только текущей команды. Например, если набрать `ls` и нажать стрелку вверх, то будет искать по истории только среди команд, начинающихся с ls
    2) История одна для всех экземпляров zsh. Это значит, что если вы что-то делали в одном окне\вкладке\ssh-сессии, и хотите повторить в другом, то вы можете легко это сделать. В отличие, от bash, где история непонятно как склеивается. Совершенно не факт, что набранные вами в этой сессии команды в ней окажутся.

    Лично для меня пункт 2) был весьма существенным при решении о миграции на zsh
    • +2
      Если иметь
      "\C-n": history-search-forward
      "\C-p": history-search-backward
      в .inputrc то по <C-n>/<C-p> получите абсолютно то же самое в bash. Стрелки — зло.

      Второе же существенно.
      • 0
        Стрелки зло — факт, но никак не могу отвыкнуть пока на 100%…
      • +1
        А зачем переопределять? По умолчанию же ctrl+R/ctrl+shift+R.
        • 0
          Разве <C-r> — не поиск по‐умолчанию? А как работает <C-S-r> я вообще не представляю: в xterm это то же, что и <C-r> (во всяком случае, с настройками по‐умолчанию). В urxvt тоже. В konsole (yakuake) это вообще клавиатурное сочетание, закрывающее вкладку (правда, не факт, что стандартное).
          • +1
            Нажатие C-r включает интерфейс поиска. Повторное C-r перемещает по результатам назад, C-S-r — вперёд.
            • 0
              При чём тут поиск? Когда вы нажимаете c<C-p> с этими настройками вы получаете что‐то вроде cat file | grep …: то есть, строку, начинающуюся на c из истории. c уже набрана. Также вы получаете не строку, содержащую c. И не строку, совпадающую с шаблоном. И не что‐то ещё.

              Кроме того, в каком терминале у вас работает <C-S-r>? Терминалы вообще обычно посылают одну и ту же последовательность и для того, и для другого.
              • 0
                А, я тогда не верно понял.

                Интересно, C+S+r у меня сейчас не работает. Хотя помню, что работал, комбинацией этой я пользовался.
  • +2
    На самом деле zsh – потрясающая оболочка, которая реально увеличивает производительность.
    Топик получился поверхностным, но, наверное, он таким и должен быть для только что состоявшихся свитчеров или тех, кто над этим задумывается.

    Прийдется свою статью запилить :)
  • 0
    Кстати в догонку — мой красивый .screenrc — куда ж без него:
    — caption always "%{=s gk}%d.%m.%Y%{+b i.} %0c %{=s y.}%-w%{+bu i.}%n %t%{-}%+w%<"
    • 0
      лучше хардстатус использовать, а то такой каптион при разбиении на регионы несколько раз явно не нужен
  • +2
    Изначально он ориентирован на любые терминалы — не только поддерживающие 256 цветов, поэтому некоторые цвета могут выглядеть не так, как нам нравится, но это можно исправить. Главный файл с настройками цветов располагается по пути:
    /usr/share/zsh/plugins/zsh-syntax-highlight/highlighters/main/main-highlighter.zsh
    Измените цвета так, как вам нужно.
    Пример:

    : ${ZSH_HIGHLIGHT_STYLES[hashed-command]:=fg=153}
    …


    Ни в коем случае не делайте это сами и не никогда рекомендуйте никому изменять файлы, контролируемые пакетным менеджером. Скажите, вы разве никогда не видели раньше : ${VAR:=val}? Эта конструкция буквально означает «записать val в переменную VAR, если последняя пуста или не определена». То есть не надо ничего менять в /usr/share, просто определите эти переменные до строки
    source /usr/share/zsh/site-contrib/zsh-syntax-highlighting.zsh
    и всё.

    Точнее, не переменные, а ассоциативный массив с нужными ключами:
    typeset -A ZSH_HIGHLIGHT_STYLES
    ZSH_HIGHLIGHT_STYLES=(
            'alias'           'fg=green,bold'
            'builtin'         'fg=yellow'
            'function'        'fg=blue,bold'
            'command'         'fg=green'
            'hashed-commands' 'fg=green,underline'
            'precommand'      'fg=cyan'
            'path'            'underline'
    )
    

    • 0
      ясно, исправлюсь
  • 0
    C удовольствием бы воспользовался всеми этими вкусностями, но, увы, он запускается гораздо медленнее чем баш
    • 0
      Кеш используете?
      • 0
        Использую zsh + oh-my-zsh и да он запускается ощутимо медленней чем баш. Можете чуть поподробней про кеш? Что rtfm?
        • 0
          … а bash, в свою очередь, запускается ощутимо медленнее, чем mksh.
          • 0
            а за mksh thanks, сейчас щупаю Кстати, если с ним работаете, не cкинете куда нибудь свой mkshrc?
        • 0
          Tonik, можно настроить кэш для автокомплита и прекомпилировать функции. Покурите доки, я просто давно с этим возился и точнее не подскажу.

          Плюс, если используете oh-my-zsh, можно пробежаться по файлам и отключить лишние вызовы compinit.

          Хотя, лично для меня это не проблема — консоль открывается один раз при буте системы секунды за 2, а новые табы в ней уже открываются практически моментально.
  • +1
    Есть еще неплохая вещь grml-zsh-config
  • 0
    Интересно, почему разработчики сразу не включат в zsh автодополнение, ведь это один из его козырей. Было было логично пользоваться этим из коробки.
  • 0
    Лучшее в shell — стандартность

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