Переход от bash к zsh [закрыт]

139

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

Пожалуйста, просто дайте один совет за ответ. Я ищу куски размером с укусом, где я могу вернуться и интегрировать лишние биты информации в мое использование оболочки постоянными темпами, а не пытаться изучить все это за один раз.

    
задан Hamish Downer 07.08.2010 в 14:40
источник

10 ответов

88

Как вы говорите, zsh во многом похожа на bash . Он имеет некоторые функции, которые вы не найдете в bash , и его можно расширить мощными способами. Не думайте двигаться как своего рода революцию, а скорее как ряд эволюционных шагов, которые помогут вам в вашей повседневной работе. Вот некоторые подсказки из моего .zshrc . Хотя вы говорите, что предпочитаете отдельные советы, этот пост является длинным списком. Тем не менее, это хорошая идея, чтобы пройти через точки один за другим. Просто добавьте интересные бит в ваш ~/.zshrc и перезагрузите source ~/.zshrc . Окончательный совет: узнайте нажатия клавиш сочетаний клавиш zsh по умолчанию («Emacs»): ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R . Вы можете заменить Alt двумя отдельными нажатиями клавиш: Alt-P эквивалентно ESC P .

Это дает вам более обширную вкладку.

autoload -U compinit
compinit

Завершение вкладок с обоих концов.

setopt completeinword

Завершение вкладки должно быть нечувствительным к регистру.

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

Лучшее завершение для killall.

zstyle ':completion:*:killall:*' command 'ps -u $USER -o cmd'

Изменяет определение слова, например. с ^ W.

autoload select-word-style
select-word-style shell

Цвета для ls.

if [[ -x "'whence -p dircolors'" ]]; then
  eval 'dircolors'
  alias ls='ls -F --color=auto'
else
  alias ls='ls -F'
fi

Ярлыки для ls.

alias ll='ls -l'
alias la='ls -a'

Одна история для всех открытых оболочек; хранить 10 000 записей. Это позволяет использовать полезную память для поиска команд, которые вы использовали в последний раз для ./configure и т. Д. Используйте Alt-P (найти команду, которая начинается так) и ^ R (поиск в истории) либерально.

HISTFILE=~/.zhistory
HISTSIZE=SAVEHIST=10000
setopt sharehistory
setopt extendedhistory

Включает все виды расширенного globbing, такие как ls ** / *. txt (найти все текстовые файлы), ls -d *(D) (показать все файлы, включая те, которые начинаются с "."). Чтобы узнать больше, перейдите в раздел man zshexpn , раздел «FILENAME GENERATION».

# superglobs
setopt extendedglob
unsetopt caseglob

Это полезно запомнить команды в вашей истории, не выполняя их.

setopt interactivecomments # pound sign in interactive prompt

Введите «..» вместо «cd ..», «/ usr / include» вместо «cd / usr / include».

setopt auto_cd

Хорошее приглашение.

PS1='[%T] %[email protected]%m:%~# '

Отобразить статистику использования CPU для команд, занимающих более 10 секунд

REPORTTIME=10

Некоторые команды, которые вы широко используете в Ubuntu.

alias 'a=sudo aptitude'
alias 'ai=sudo aptitude install'
alias 'ar=sudo aptitude remove'
alias 'au=sudo aptitude update'
alias 'ag=sudo aptitude safe-upgrade'
alias 'as=apt-cache search'
alias 'aw=apt-cache show'

Списки пакетов, отсортированные по их размеру - полезны при выборе пакетов, которые занимают ваше дисковое пространство.

function apt-list-packages {
  dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | grep -v deinstall | sort -n | awk '{print " "}'
}
    
ответ дан loevborg 08.08.2010 в 19:50
источник
13

Я бы рекомендовал книгу От bash до Z Shell . У него есть все советы, необходимые для переключения оболочки. Он объясняет различия обеих оболочек и упрощает создание новой zsher.

    
ответ дан qbi 07.08.2010 в 22:36
7

Вот мой .zshrc и это самая важная вещь! zsh имеет много вариантов, которые вы можете использовать, поэтому ознакомьтесь с некоторыми примерами в сети или прочитайте документацию на странице Zsh .

My .zshrc не содержит никаких действительно классных вещей, кроме метки времени в правой части командной строки.

Btw, не забудьте попробовать табуляцию, где есть несколько примеров:

mplayer -a[tab]

покажет что-то вроде этого:

mplayer -a
 -ac                 -- force usage of a specific audio codec
 -af                 -- activate audio filters
 -afm                -- force usage of a specific audio codec family
 -alang              -- select the DVD audio language
 -ao                 -- specify audio driver
 -aop                -- specify audio output filter

И если вы используете безшовные ssh-ключи или ssh-agent, вам может показаться полезным использовать заготовку удаленных файлов:

scp apollo:/home/user/[tab]
Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Templates/ Videos/

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

Но будьте осторожны, эта оболочка сделает вас ленивыми и заставит вас почувствовать, что стандартная оболочка глупа и раздражает!

    
ответ дан LassePoulsen 07.08.2010 в 17:42
5

Несколько специально полезных расширенных глобусов:

1- rmdir *(/^F) - удалить все непустые каталоги в текущем каталоге

2- grep traceback /srv/log/**/*(.m-2) - искать это регулярное выражение в файлах, измененных за последние два дня

3- chmod g+w **/*(U^I) - делать любые файлы, принадлежащие мне, а не записывать на группы, с возможностью записи в группы

Да, конечно, вы можете написать это с помощью find , но это легче отключить. У него есть два недостатка, чтобы быть справедливыми: оба они должны быть расширены в командной строке: если он соответствует тысячам файлов, командная строка будет слишком длинной, и это не удастся, и, во-вторых, все файлы будут найдены перед запуском файла.

(вам понадобится setopt extendedglob , если он еще не включен)

    
ответ дан poolie 15.10.2010 в 03:21
4

Я не так много знаю о bash, поэтому я не могу скомпоновать. Некоторые фрагменты из моего конфигурационного файла zsh.

Некоторая конфигурация

HISTFILE=~/.zsh_history
HISTSIZE=1000
SAVEHIST=1000
REPORTTIME=10 # print elapsed time when more than 10 seconds
setopt NO_HUP
setopt NO_LIST_BEEP
setopt LOCAL_OPTIONS # allow functions to have local options
setopt LOCAL_TRAPS # allow functions to have local traps
setopt HIST_VERIFY
setopt SHARE_HISTORY # share history between sessions ???
setopt EXTENDED_HISTORY # add timestamps to history
setopt PROMPT_SUBST
setopt CORRECT
setopt COMPLETE_IN_WORD
setopt IGNORE_EOF

setopt APPEND_HISTORY # adds history
setopt INC_APPEND_HISTORY SHARE_HISTORY  # adds history incrementally and share it across sessions
setopt HIST_IGNORE_ALL_DUPS  # don't record dupes in history
setopt HIST_REDUCE_BLANKS
# Leave some chars out of the out of WORDCHARS so ^W acts more nicely 
WORDCHARS='*?_-[]~\!#$%^(){}<>|'@#$%^*()+:?'

Git в приглашении

if [[ -n $SSH_CONNECTION ]]; then
  export PS1='%m:%3~$(git_info_for_prompt)%# '
else
  export PS1='%3~$(git_info_for_prompt)%# '
fi

Некоторые горячие клавиши, вставьте в начале строки какой-то текст.

insert_sudo     () { zle beginning-of-line; zle -U "sudo "         }
insert_apt      () { zle beginning-of-line; zle -U "sudo apt-get " }
insert_gem      () { zle beginning-of-line; zle -U "sudo gem "     }
insert_install  () { zle -U "install "     }

zle -N insert-sudo      insert_sudo
zle -N insert-apt       insert_apt
zle -N insert-gem       insert_gem
zle -N insert-install   insert_install

bindkey "^B" insert-gem
bindkey "^N" insert-install
bindkey "^k" insert-sudo
bindkey "^a" insert-apt

Функции, хранящиеся затем в ~ / .zsh / functions

git_info_for_prompt

local g="$(git rev-parse --git-dir 2>/dev/null)"
if [ -n "$g" ]; then
  local r
  local b
  if [ -d "$g/../.dotest" ]
  then
    if test -f "$g/../.dotest/rebasing"
    then
      r="|REBASE"
    elif test -f "$g/../.dotest/applying"
    then
      r="|AM"
    else
      r="|AM/REBASE"
    fi
    b="$(git symbolic-ref HEAD 2>/dev/null)"
  elif [ -f "$g/.dotest-merge/interactive" ]
  then
    r="|REBASE-i"
    b="$(cat "$g/.dotest-merge/head-name")"
  elif [ -d "$g/.dotest-merge" ]
  then
    r="|REBASE-m"
    b="$(cat "$g/.dotest-merge/head-name")"
  elif [ -f "$g/MERGE_HEAD" ]
  then
    r="|MERGING"
    b="$(git symbolic-ref HEAD 2>/dev/null)"
  else
    if [ -f "$g/BISECT_LOG" ]
    then
      r="|BISECTING"
    fi
    if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
    then
      if ! b="tag: $(git describe --exact-match HEAD 2>/dev/null)"
      then
        b="$(cut -c1-7 "$g/HEAD")..."
      fi
    fi
  fi

  if [ -n "" ]; then
    printf "" "${b##refs/heads/}$r"
  else
    printf "[%s]" "${b##refs/heads/}$r"
  fi
fi

Некоторые параметры github

#compdef github

_github() {
  if (( CURRENT > 2 )); then
    # shift words so _arguments doesn't have to be concerned with second command
    (( CURRENT-- ))
    shift words
    # use _call_function here in case it doesn't exist
    _call_function 1 _github_${words[1]}
  else
    _values "github command" \
     "fetch[Fetch from a remote to a local branch.]" \
     "ignore[Ignore a SHA (from 'github network commits')]" \
     "fetch_all[Fetch all refs from a user]" \
     "info[Info about this project.]" \
     "browse[Open this repo in a web browser.]" \
     "home[Open this repo's master branch in a web browser.]" \
     "clone[Clone a repo.]" \
     "pull-request[Generate the text for a pull request.]" \
     "network[Project network tools.]" \
     "pull[Pull from a remote.]" \
     "track[Track another user's repository.]"
  fi
}

_github_pull() {
  _arguments \
    "--merge[Automatically merge remote's changes into your master.]"
}
_github_clone() {
  _arguments \
    "--ssh[Clone using the [email protected] style url.]"
}

_github_track() {
  _arguments \
    "--private[Use [email protected]: instead of git://github.com/.]" \
    "--ssh[Equivalent to --private.]"
}

_github_network() {
  if (( CURRENT > 2 )); then
    # shift words so _arguments doesn't have to be concerned with second command
    (( CURRENT-- ))
    shift words
    # use _call_function here in case it doesn't exist
    _call_function 1 _github_network_${words[1]}
  else
    _values "github network command" \
     "web[Open network in a web browser.]" \
     "list[List networked repositories.]" \
     "fetch[Fetched commits for a given networked repository.]" \
     "commits[List networked commits not pulled into this repo.]"
  fi
}

_github_network_commits() {
  _arguments \
    "--project[Filter commits on a certain project.]" \
    "--author[Filter commits on a email address of author.]" \
    "--common[Show common branch point.]" \
    "--nocache[Do not use the cached network data.]" \
    "--sort[How to sort : date(*), branch, author.]" \
    "--thisbranch[Look at branches that match the current one]" \
    "--applies[Filter commits to patches that apply cleanly.]" \
    "--limit[Only look through the first X heads - useful for really large projects]" \
    "--before[Only show commits before a certain date.]" \
    "--after[Only show commits after a certain date.]" \
    "--shas[Only show shas.]" \
    "--cache[Use the network data even if it's expired.]" \
    "--noapply[Filter commits to patches that do not apply cleanly.]"
}
    
ответ дан Pedro 02.09.2010 в 21:54
3

Я в той же поездке:)

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

Возьмите это в качестве примера Ссылка , посмотрите комментарии и взломайте свой путь. Stackoverflow и severphault и хорошие места для поиска.

Мне еще предстоит погрузиться в Ссылка , но у меня нет такого времени, чтобы проиграть:)

    
ответ дан tutuca 07.08.2010 в 16:41
3

Узнайте о расширенных глобусах и рекурсивных шарах в zsh.

Узнайте немного о zstyle и о том, как различные вещи (особенно завершение) позволяют настроить их конфигурацию с помощью zstyle.

Посмотрите на ассоциативные массивы. Также стандартные массивы (остерегайтесь различий от bash, к лучшему!)

Если вы используете регулярные выражения, просмотрите =~ (у которого также есть bash) и рассмотрите: setopt rematch_pcre

Избегайте написания сценариев, которые зависят от магии от zsh, потому что, хотя это фантастика для использования, zsh может иметь тенденцию к записи только для записи. Если вы используете слишком много, подумайте, когда переключиться на такой язык, как Python.

Zsh соблазнительна. Это темная сторона. Добро пожаловать.

    
ответ дан Phil P 02.09.2010 в 21:21
2

Большое преимущество - отличное завершение вкладки с предварительно упакованными скриптами завершения для многих команд. Вот пример, показывающий выход apt-get<TAB> :

apt-get
action
autoclean        build-dep        clean            dselect-upgrade  install          remove           update           
autoremove       check            dist-upgrade     help             purge            source           upgrade          
    
ответ дан hariharan022 14.11.2010 в 09:39
1

Я дал купе переговоров и перевел несколько человек на zsh. Я сохраняю github repo моих (каковы преимущества) заметки вместе с стартером и копией моей собственной zsh config в github здесь.

Ссылка

    
ответ дан Rick 03.09.2010 в 03:56
0

Еще один отличный ресурс - страница любителей zsh (происходит от grml zsh site ).

    
ответ дан qbi 07.08.2010 в 22:38