Пользователь
0,0
рейтинг
18 октября 2008 в 00:52

Администрирование → 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.
@pax
карма
21,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

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

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

Комментарии (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
      • 0
        угу =)
  • +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.

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