Вопрос Перемещение с bash на zsh [закрыто]


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

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


141
2017-08-07 12:40


происхождения


Мне было бы интересно узнать, возможно ли интегрировать команду Ubuntu, не найденную с zsh. Из-за этого я снова переключился на bash (и многие другие неприятности). - Marius Gedminas
Связанные темы на других сайтах Exchange: Стоит переключиться на zsh для повседневного использования?  Что в вашем .zshrc?  Какие функции zsh вы используете?  Уникальные особенности bash по сравнению с zsh  Есть ли причина использовать bash над zsh?  Какие функции находятся в zsh и отсутствуют в bash, или наоборот? - Gilles
Еще две интересные ссылки: «Вопросы ZSH» zsh.sourceforge.net/FAQ & "ZSH - ваш друг" mikegrouchy.com/blog/zsh-is-your-friend.html - Shadok
@MariusGedminas: (отсюда) zsh действительно поддерживает это, но вы должны включить его вручную. Просто добавь source /etc/zsh_command_not_found на ваш .zshrc, - naught101


ответы:


Как ты говоришь, 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, раздел «ПОЛУЧЕНИЕ ФИЛАЕМА».

# 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:%~# '

Отображать статистику использования 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 $1" "$2}'
}

93
2017-08-08 17:50



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


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


14
2017-08-07 20:36



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


Вот мой .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

И если вы используете unsigned ssh-keys или ssh-agent, вам может показаться полезным использовать tabcomplete удаленные файлы:

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

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

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


8
2017-08-07 15:42





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

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

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

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

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

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


5
2017-10-15 01:21





Я не так много знаю об 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 "$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.]"
}

4
2017-09-02 19:54





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

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

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

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


3
2017-08-07 14:41





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

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

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

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

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

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


3
2017-09-02 19:21





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

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

2
2017-11-14 08:39





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

http://github.com/mitechie/zshrc


1
2017-09-03 01:56