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


143

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

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


8
Я хотел бы знать, возможно ли объединить команду Ubuntu «not-found» с zsh. Из-за этого я переключился обратно на bash (и много других неприятностей).
Мариус Гедминас


Еще две интересные ссылки: «ЗШ FAQ» zsh.sourceforge.net/FAQ и «ЗШ является вашим другом» mikegrouchy.com/blog/zsh-is-your-friend.html
Shadok

3
@MariusGedminas: ( отсюда ) zsh поддерживает это, но вы должны включить его вручную. Просто добавь source /etc/zsh_command_not_foundв свой .zshrc.
naught101

Ответы:


94

Как вы говорите, 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'

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

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

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

# superglobs
setopt extendedglob
unsetopt caseglob

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

setopt interactivecomments # pound sign in interactive prompt

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

setopt auto_cd

Хорошая подсказка.

PS1='[%T] %n@%m:%~# '

Отображение статистики использования процессора для команд, занимающих более 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 $1" "$2}'
}

6
+1 за полезность. -1 для тайной адвокатуры emacs!
Триптих

2
Вам также может понравиться [ github.com/robbyrussell/oh-my-zsh](oh-my-zsh), который добавляет множество плагинов в zsh.
RedPixel

14

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


Книга отлично подходит как для пользователей bash, так и для пользователей zsh. Вы должны любить, как каждая глава начинается с того, что «и bash, и zsh могут делать все это», а затем приводит к еще 30 страницам «и вот только материал zsh»
Рик

8

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

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

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

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/

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

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


5

Пара особенно полезных расширенных шаров:

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

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

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

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

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


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

The 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 "$1" ]; then
    printf "$1" "${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 git@github.com style url.]"
}

_github_track() {
  _arguments \
    "--private[Use git@github.com: 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.]"
}

3

Я в одной поездке :)

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

Возьмите это в качестве примера http://matt.blissett.me.uk/linux/zsh/zshrc , посмотрите комментарии и взломайте свой путь. Stackoverflow и severphault и хорошие места для поиска тоже.

Мне еще предстоит погрузиться в http://dotfiles.org/.zshrc , но у меня не так много времени, чтобы терять :)


3

Узнайте о расширенных globbing и рекурсивных globs в zsh.

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

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

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

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

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


2

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

apt-get
action
autoclean        build-dep        clean            dselect-upgrade  install          remove           update           
autoremove       check            dist-upgrade     help             purge            source           upgrade          

1

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

http://github.com/mitechie/zshrc


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.