Перехід від bash до zsh [закрито]


143

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

Будь-ласка, дайте лише одну пораду на відповідь. Я шукаю шматочки розміру укусу, куди я можу повернутися та інтегрувати зайві шматочки інформації у своє використання оболонки постійним темпом, а не намагатися навчитися це все за один раз.


8
Я хотів би знати, чи можна інтегрувати команду Ubuntu-не-знайдено з zsh. Я перейшов назад до башти через це (та багато інших роздратування).
Маріус Гедмінас


Ще два цікавих посилання: "ZSH FAQ" zsh.sourceforge.net/FAQ & "ZSH - твій друг" mikegrouchy.com/blog/zsh-is-your-friend.html
Шадок

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}'

Краще завершення роботи для кілла.

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

Змінює визначення поняття "слово", наприклад, з ^ W.

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

Кольори для лс.

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

Вмикає всі види розширеного глобулювання, такі як 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-zshSense(oh-my-zsh), який додає багато додатків до zsh.
RedPixel

14

Я б порекомендував книгу Від баша до Z Шелла . У ньому є всі поради, необхідні для перемикання вашої оболонки. Це пояснює відмінності обох оболонок і полегшує новий zsher.


Книга чудово підходить і для користувачів bash, і для zsh. Вам доведеться полюбити, як кожна глава починається з "і bash, і zsh може все це зробити", а потім веде на ще 30 сторінок "і ось лише zsh",
Rick

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-агент, вам може здатися корисним для вкладки неповних віддалених файлів:

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

Після отримання списку ви можете натиснути вкладку більше разів, щоб переглядати різні можливості.

Але будьте попереджені, ця шкаралупа зробить вас лінивим і дасть вам відчути, що стандартна оболонка дурна і дратівлива!


5

Кілька конкретно корисних розширених глобусів:

1- rmdir *(/^F)- видалити всі непорожні каталоги в поточному каталозі

2- grep traceback /srv/log/**/*(.m-2)- шукайте цей регекс у файлах, змінених за останні два дні

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

Так, звичайно, ви можете написати це за допомогою, findале це простіше зірвати. Справедливості мають два недоліки, і те, що вони розширюються в командному рядку: якщо він відповідає багатьом тисячам файлів, командний рядок буде занадто довгим, і це не вдасться, по-друге, всі файли знайдені перш ніж файл почне працювати.

(Вам знадобиться, setopt extendedglobякщо це ще не ввімкнено)


4

Я не знаю так багато про баш, тому не можу порівняти. Деякі фрагменти з мого конфігураційного файла 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 / функції

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 і Severfault і хороші місця для пошуку теж.

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


3

Дізнайтеся про розширені глобусні та рекурсивні глобуси в zsh.

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

Подивіться на асоціативні масиви. Також стандартні масиви (остерігайтеся відмінностей від bash, на краще!)

Якщо ви використовуєте регулярні вирази, перегляньте =~(який баш також має) і врахуйте:setopt rematch_pcre

Уникайте написання сценаріїв, які залежать від трохи більше магії zsh, оскільки, хоча це фантастично використовувати, zsh може схилятися лише до запису. Якщо ви використовуєте занадто багато іншого, подумайте, коли перейти на таку мову, як Python.

Зш спокусливий. Це темна сторона. Ласкаво просимо.


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.