zsh

    Привет!

    Поговорим о самом удобном shell-е для Linux. Знакомьтесь — это zsh. Многие пользователи Linux не променяют bash ни на что другое, но я, будучи склонным к экспериментам, не поленился и поставил zsh.

    Наверняка он есть во многих дистрибутивах, поэтому я не буду углубляться в то, как его установить. Скажу просто, что с точностью в 95% вы найдете его в репозиториях своего дистрибутива.

    Установив, вы можете сразу сделать его шеллом по умолчанию: находим строчку с вашим логином в /etc/passwd и меняем /bin/bash на /bin/zsh. При первом запуске он предложит вам настроить себя — включите там автодополнение по максимуму. Для тех, кому лениво, делюсь своим ~/.zshrc:

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

    autoload -U compinit promptinit
    compinit
    promptinit;

    if [[ $EUID == 0 ]]
    then
    PROMPT=$'%{\e[1;31m%}%n %{\e[1;34m%}%~ #%{\e[0m%} ' # user dir %
    else
    PROMPT=$'%{\e[1;32m%}%n %{\e[1;34m%}%~ %#%{\e[0m%} ' # root dir #
    fi
    RPROMPT=$'%{\e[1;34m%}%T%{\e[0m%}' # right prompt with time

    alias ls='ls --color=auto'
    alias grep='grep --colour=auto'

    Перенастроить под себя можно потом, когда попробуете. Правда я не помню как, но все же умеют пользоваться man ;). Да, о дукементации: там ее много, настроить можно кучу всего, если есть желание разобраться.

    бенефиты
    1) продвинутый автокомплит. например:
    cd /u/l/sb + tab превратится в cd /usr/local/sbin/

    sudo — (+ tab) превращается в
    sudo —
    -H — set HOME environment variable
    -K — remove user timestamp
    -L — list options from Default section
    -S — read password from stdin
    -V — show version
    -b — run command in background
    -h — show help
    -k — invalidate user timestamp
    -l — list allowed commands
    -p — password prompt
    -r — Kerberos realm
    -s — run SHELL
    -u — user name
    -v — validate user timestamp

    В отличии от bash повторное нажатие на tab приведет к подстановке первого аргумента. Нажмете еще раз — подставится второй.

    2) настройка управления в стиле vi или emacs
    3) 2 promt-a: в правый, к примеру, можно поместить часы
    4) разделяемая история
    5) еще куча всего, что я пока не осилил.

    Напоследок замечу, что после zsh не хочется переходить ни на что другое =)

    — p.s. коллективные блоги с системой оценок меня немного напрягают, поэтому скромно пишу об экспериментах в свой жж. если кому интересно, то ник pax13.
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 64
    • +6
      Советую всё же воспользоваться zkbd, что бы не мучаться при переходе на другие терминалы.
      # part of .zshrc
      autoload zkbd
      [[ ! -d ~/.zkbd ]] && mkdir ~/.zkbd
      [[ ! -f ~/.zkbd/$TERM-$VENDOR-$OSTYPE ]] && zkbd
      source  ~/.zkbd/$TERM-$VENDOR-$OSTYPE
      #setup key accordingly
      [[ -n "${key[Home]}"    ]]  && bindkey  "${key[Home]}"    beginning-of-line
      [[ -n "${key[End]}"     ]]  && bindkey  "${key[End]}"     end-of-line
      [[ -n "${key[Insert]}"  ]]  && bindkey  "${key[Insert]}"  overwrite-mode
      [[ -n "${key[Delete]}"  ]]  && bindkey  "${key[Delete]}"  delete-char
      [[ -n "${key[Up]}"      ]]  && bindkey  "${key[Up]}"      up-line-or-history
      [[ -n "${key[Down]}"    ]]  && bindkey  "${key[Down]}"    down-line-or-history
      [[ -n "${key[Left]}"    ]]  && bindkey  "${key[Left]}"    backward-char
      [[ -n "${key[Right]}"   ]]  && bindkey  "${key[Right]}"   forward-char
      
      • 0
        Вот это удобно! В Zsh столько всего — не уследишь… :)
        • 0
          Только почему то не работает это у меня:

          zkbd: must be run as a function or shell script, not sourced

          % zsh --version
          zsh 4.3.5 (i686-pc-linux-gnu)</.code>
          • +1
            путь к функции укажи
            у мну сделано проще, в начале поставлено
            alias zkbd='zsh /usr/share/zsh/4.3.5/functions/Misc/zkbd'
        • +4
          Спасибо за вводную статью. Переходить уж точно не хочется — zsh очень могуч!

          Для того, чтобы велась история комманд (например последние 100 штук) нужно добавить в .zshrc:

          SAVEHIST=100
          HISTFILE=~/.zsh_history


          Для того чтобы настроить правильное поведение нажатия клавиш Home, End итп (а оно скорее всего понадобится, так как zsh не читает /etc/inputrc, в отличие от bash), воспользуйтесь сочетанием клавиш Ctrl-v Home в терминале. Символ, который отобразится после этого можно использовать для задания поведения.

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

          Поведение клавиш может отличаться в зависимости от используемого терминала (я пользую rxvt-unicode).

          • +1
            Куча конфигов на любой вкус для великого zsh dotfiles.org/.zshrc
            • +4
              >>находим строчку с вашим логином в /etc/passwd и меняем /bin/bash на /bin/zsh
              $chsh [user] изящнее будет, да и рут не нужен тогда =)
              • 0
                тоже глаза резало, когда читал :)
                • 0
                  а usermod и pw отменили?
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • 0
                      и кроме линукса тоже ничего нет, да? или типа сабж можно использовать только в линуксе?
                      • +1
                        Ну это типа блог «Linux для всех»
                  • 0
                    ваша правда
                  • –1
                    Ух ты как интересно (=
                    • 0
                      А мне нравится csh
                      тем что можно недонабрать команду до конца, затем нажать стрелку вверх и будет поиск по хистори начинающийся с этих символов.

                      Что я делаю не так?
                      • 0
                        ну поиск по хистори стрелочками по первым буквы комманды умеет не только zsh и csh, но и к примеру tcsh :) а вот райтпромпт ничего кроме zsh не умеет, по табу казать список доступных опций для продолжения команды и потом их выбирать стрелочками на клавиатуре тоже никто кроме zsh не умеет. ну есть еще много чего чем zsh рулит.

                        не могу поверить своим глазам, неужто кто-то из линуксятнегов смог выкинуть свой баш и посмотреть на что-то другое? ну что ж, автор молодец, смог не только поставить zsh, но и прочитать немного про него :)
                        • 0
                          Вроде бы есть какой-то пакет скриптов к tcsh где в зависимости от команды нужное дописывается, вроде как во Frenzy 0.3 стоят (давно не видел его)
                          • 0
                            не могу поверить своим глазам, неужто кто-то из линуксятнегов смог выкинуть свой баш и посмотреть на что-то другое?

                            Что ж у фряшников такие проблемы с самооценкой, что надо непременно других опускать, чтоб свою значимость почувствовать…
                            • 0
                              не видел ни одного линупсойда, который бы не кричал что линупс рулез, а баш лучший шелл. автор топика ломает шаблоны :)

                              пс: я не говорил что я «фряшник», но точно могу сказать что не «линупсойд» :)
                              • 0
                                То есть аватар Вы себе поставил исключительно потому, что картинка понравилась?
                                • –1
                                  картинка и в самом деле очень ничего. не люблю я пингвинов, пускай их черти в аду дрючат :D кого то волнует что там на картинке? вот у вас человечек махает ручкой.

                                  пс: с мифологической природой Beasty с лого BSD и его непричастности к силам зла я знаком. :)
                            • НЛО прилетело и опубликовало эту надпись здесь
                              • +1
                                попробуй в ~/.zshrc всунуть следующее:

                                bindkey "^[[A" history-beginning-search-backward
                                bindkey "^[[B" history-beginning-search-forward
                                • НЛО прилетело и опубликовало эту надпись здесь
                            • 0
                              Ну, так и bash умеет.
                              А zsh, пожалуй, сегодня попробую.
                            • НЛО прилетело и опубликовало эту надпись здесь
                              • –8
                                bullshit.
                                • НЛО прилетело и опубликовало эту надпись здесь
                                  • 0
                                    сколько не видел админов — если пользуются zsh на одном компе, то совсем нет причин не пользоваться bash на другом.

                                    zsh даёт _настолько_ много, что отказываться от него — идиотизм.
                                • 0
                                  Если не использовать сильно специфичные вещи для одного шелла, то особой разницы нету.
                                  На всех полноценных шеллах (/bin/sh не в счет :) есть автодополнение, имена команд от шелла не зависят.
                                  Проблемы «знать» bash имхо нет, если пользуешься zsh.
                                  • 0
                                    А наете почему никто не хочет переходить с баша? потому что это дефолтный пакет на всех серверах. Сделали это так что бы админу не приходилось знать по 50 шелов… а было достаточно одного. Дома канеш можно ставить что угодно, но когда работаешь в калективе с хреновой тучей серверов, то только баш.

                                    Это Вы просто так сказали или можете обосновать?
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                      • +1
                                        Шелл — не язык программирования. Стандартные операции и возможности, которые есть в sh, есть во всех других шеллах (кроме разве что крошечных вроде бизибоксовых). Соответственно, если знать sh, не составит проблемы работать с любым другим шеллом.
                                        Более того, преимущества того же zsh над башем проявляются именно во взаимодействии с пользователем. На серверах нет никакого взаимодействия. На серверах есть скрипты, в которых от шелла опять же требуются возможности на уровне sh. Для остального есть стандартные утилиты — awk, grep, find, xargs. Если чего-то нельзя сделать с таким инструментарием — значит, это нужно делать с применением более тяжеловесных языков: перла, питона. Использовать для этого нестандартные расширения того же баша — ненадежно и неправильно в принципе.
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                          • 0
                                            Погодите… не стоит за меня расписыватся… я не гоорил что Шелл — это язык программинга

                                            А я и не утверждал, что Вы такое говорили. Вы сравнили работу админов с разными шеллами с работой программистов с разными языками. Я указал на то, что сравнение некорректно, поскольку разница между шеллами на уровне написания скриптов значительно меньше, нежели между языками программирования. Поэтому
                                            Сделали это так что бы админу не приходилось знать по 50 шелов… а было достаточно одного. Дома канеш можно ставить что угодно, но когда работаешь в калективе с хреновой тучей серверов, то только баш.

                                            не соответствует истине. Для администрирования от шелла не требуется ничего сверх того, что умеют почти все шеллы. Тут уж никакой разницы — баш или что-то другое. Если админ для скриптов вместо стандартных системных утилит использует плюшки конкретного шелла — это плохой админ.
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                              • 0
                                                Тоесть вы только что сказали, что если я использую в шеле те функции которых нет в стандартном — то я плохой админ

                                                Не подменяйте понятия. Я сказал конкретно о скриптах, которые ДОЛЖНЫ работать во всех sh-совместимых шеллах. Для написания скриптов не нужно продвинутое автодополнение, история команд и прочие прелести zsh.
                                                Но если я их не использую, то зачем мне ставить другой шел взамен стандартного

                                                Чтобы использовать указанные выше автодополнение, историю команд и прочие прелести. Для работы _пользователя_ с шеллом использовать, а не для выполнения шеллом скриптов! Если я пишу скрипты с #!/bin/sh, то я знаю, что эти скрипты будут работать всегда и везде. А для повседневной работы буду пользоваться тем шеллом, который мне больше нравится, или даже менять шеллы по десять раз в день — от этого ничего не изменится и не сломается.
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                  • 0
                                                    Согласен. Дефолт — это sh. А любой шелл может работать в режиме sh. Поэтому особого смысла держать везде bash тоже нет :)
                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                      • 0
                                                        У баша нестандартных фич тоже достаточно. А зеленых админов за что-то, отличное от #!/bin/sh, надо бить по рукам, пока не сменят цвет :)
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                    • 0
                                      Про «все серверы» сказано громко и не совсем верно, но в подавляющем числе *никсов — определенно да. Даже Макось и OpenSolaris на него перебрались.
                                    • 0
                                      Вот _минимум_ =)

                                      # AutoCD
                                      setopt autocd
                                      
                                      # Set xterm title
                                      case $TERM in (xterm*|rxvt)
                                          precmd () { print -Pn "\e]0;%n@%m: %~\a" }
                                          preexec () { print -Pn "\e]0;%n@%m: $1\a" }
                                          ;;
                                      esac
                                      
                                      # Extended opts
                                      setopt extendedglob
                                      setopt extended_glob
                                      
                                      # Expands {abc}file to afile bfile cfile, etc.
                                      setopt brace_ccl
                                      
                                      # Searches =name in PATH
                                      setopt equals
                                      
                                      # Dont require a leading dot for matching "hidden" files
                                      setopt glob_dots
                                      
                                      # Enable multiple redirections
                                      setopt multios
                                      
                                      # Report status of bg jobs immediately
                                      setopt notify
                                      
                                      # Report status of bg jobs if exiting
                                      setopt check_jobs
                                      
                                      # Suffix aliases
                                      alias -s py='env python'
                                      alias -s php='env php'
                                      
                                      • 0
                                        Да, zsh на самом мощнейшая вещь. Чего он только не умеет. Там даже тетрис встроенный есть. Включается следующим образом:

                                        autoload -U tetris
                                        zle -N tetris
                                        bindkey КЛАВИША tetris
                                        • 0
                                          Прописал zsh вместо bash в окошечном terminal под гномом. Выяснилось, что оно не подменяет заголовок текущим каталогом. Как сделать, чтобы подменяло?
                                          • 0
                                            блин, увидел ответ на два поста выше =)

                                            case $TERM in (xterm*|rxvt)
                                            precmd () { print -Pn "\e]0;%n@%m: %~\a" }
                                            preexec () { print -Pn "\e]0;%n@%m: $1\a" }
                                            ;;
                                            esac
                                        • +1
                                          имхо zsh удобнее bash'a, но поддерживает ли он unicode utf8? когда года два назад я им пользовался, ещё не было поддержки в официальном релизе, а как щас? поддерживает ли его в автодополнении?
                                          • 0
                                            zsh 4.3.6 (x86_64-pc-linux-gnu)

                                            max ~ % cd русс [tab]
                                            русс/ русск/ русский/
                                            • 0
                                              в КОИ тоже так можно делать :)

                                              в 2005 был задан вопрос (релиз 3. х. х какой-то):
                                              Q: Why doesn't zsh have proper UTF-8 support?

                                              A: The code has not been written yet.

                                              Q: What makes UTF-8 support difficult to implement?

                                              A: In order to handle arbitrary encodings the correct way, significant and intrusive changes must be made to the shell


                                              в ньюсах про UTF-8 тоже мало хорошего:
                                              Release 4.3.1
                                              This is the first release of the 4.3 series, which contains initial support for multibyte characters in the shell's line editor (in particular UTF-8, although any character set supported by the system library is usable)


                                              на счёт того, поддерживается ли сейчас unicode UTF-8 полностью я не нашёл записей.
                                              • –1
                                                max ~ % locale
                                                LANG=en_US.UTF-8
                                                LC_CTYPE=«en_US.UTF-8»
                                                LC_NUMERIC=«en_US.UTF-8»
                                                LC_TIME=«en_US.UTF-8»
                                                LC_COLLATE=«en_US.UTF-8»
                                                LC_MONETARY=«en_US.UTF-8»
                                                LC_MESSAGES=«en_US.UTF-8»
                                                LC_PAPER=«en_US.UTF-8»
                                                LC_NAME=«en_US.UTF-8»
                                                LC_ADDRESS=«en_US.UTF-8»
                                                LC_TELEPHONE=«en_US.UTF-8»
                                                LC_MEASUREMENT=«en_US.UTF-8»
                                                LC_IDENTIFICATION=«en_US.UTF-8»
                                                LC_ALL=

                                                я что-то не понимаю?
                                                • 0
                                                  это локали машинки вашей, а найти бы где-то хоть строчку в release_notes что zsh поддерживает юникод целиком.
                                                  • 0
                                                    да, спасибо, я знаю, что это =)

                                                    «zsh поддерживает юникод целиком» — лично меня и так устраивает, с русскими буквами нормально работает. вам нужно что-то конкретно? или просто хотите, чтобы всё было на utf-8?
                                                    • 0
                                                      мне нужна поддержка именно полная для работы :( дома мог бы и такую версию поставить, но на удалённые серваки увы, только полностью уникодовый шел можно.
                                          • 0
                                            А мне чень нравится fish (friendly interactive shell): fishshell.org/
                                            • 0
                                              что то на экране одни иероглифы) это точно тот сайт?
                                              • 0
                                                что то на экране одни иероглифы) это точно тот сайт?
                                                гугл подсказывает, что все таки: fishshell.com/
                                              • 0
                                                пользуюсь zsh уже второй год, можете тут взять мой конфиг, красив и функционален.
                                                • 0
                                                  спасибо большое кстати за конфиг, пользуюсь, немного допилил добавкой поддержки home, end, delete и прочими вкусностями, но за основу именно ваш взят :)
                                                  • 0
                                                    404. Можно повторить?
                                                    • 0
                                                      поправил ссылку) за 4 года что-то в конфиге уже поменялось
                                                  • 0
                                                    да говняшка этот zsh. Большая часть его «фич» — не нужные никому перделки, которые к тому же надо агрессивно забатывать. Зато при настройке этого отстоя начинают выползать проблемы как раз связанные с неполной поддержкой UTF-8.
                                                    // fish определённо лучше. И настроен хорошо сразу из коробки, в отличии от этого красноглазого говна. Впрочем, бздуны это оценят, у них и склад ума такой, что охота поебаться и всё равно, приходится использовать koi8-r, т.к. сама система говняно работает с utf-8 :D
                                                    • 0
                                                      Странно, что никто не упомянул про oh-my-zsh.

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