it-swarm-vi.com

Chuyển từ bash sang zsh

Tôi đang xem xét chuyển từ bash sang zsh vì tôi thường bắt gặp những bài đăng ca ngợi zsh. Tôi là một người sử dụng dòng lệnh có kinh nghiệm và tôi cho rằng những điều cơ bản khá giống nhau, vì vậy tôi đang tìm kiếm lời khuyên để có được lợi ích của việc di chuyển, và bất kỳ vấn đề nào cũng cần phải biết.

Xin vui lòng chỉ cho một chút lời khuyên cho mỗi câu trả lời. Tôi đang tìm kiếm những khối kích cỡ cắn, nơi tôi có thể quay lại và tích hợp thêm các thông tin bổ sung vào việc sử dụng Shell của mình với tốc độ ổn định thay vì cố gắng học tất cả trong một lần.

142
Hamish Downer

Như bạn nói, zshtương tự ở nhiều khía cạnh với bashname__. Nó có một số tính năng bạn sẽ không tìm thấy trong bashvà nó có thể được mở rộng theo những cách mạnh mẽ. Đừng nghĩ rằng di chuyển như một loại cuộc cách mạng, mà là một loạt các bước tiến hóa giúp bạn trong công việc hàng ngày. Dưới đây là một số gợi ý từ .zshrc của tôi. Mặc dù bạn nói rằng bạn thích những lời khuyên đơn lẻ, bài viết này là một danh sách dài. Tuy nhiên, đó là một ý tưởng tốt để đi qua từng điểm một. Chỉ cần thêm các bit thú vị vào ~/.zshrc của bạn và tải lại bằng source ~/.zshrc. Mẹo cuối cùng: tìm hiểu các tổ hợp phím của phím tắt zshname __ 's mặc định ("Emacs"): ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R. Bạn có thể thay thế Altbằng hai tổ hợp phím riêng biệt: Alt-P tương đương với ESCPname__.


Điều này cung cấp cho bạn hoàn thành tab rộng hơn.

autoload -U compinit
compinit

Hoàn thành tab từ cả hai đầu.

setopt completeinword

Hoàn thành tab nên không phân biệt chữ hoa chữ thường.

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

Hoàn thành tốt hơn cho killall.

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

Thay đổi định nghĩa của "Word", ví dụ: với ^ W.

autoload select-Word-style
select-Word-style Shell

Màu sắc cho ls.

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

Các phím tắt cho ls.

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

Một lịch sử cho tất cả các vỏ mở; lưu trữ 10.000 mục. Điều này biến điều này thành một trợ giúp bộ nhớ hữu ích để tìm các lệnh bạn đã sử dụng lần trước cho ./configure, v.v ... Sử dụng Alt-P (tìm lệnh bắt đầu như thế này) và ^ R (tìm kiếm trong lịch sử) một cách tự do.

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

Cho phép tất cả các loại hình mở rộng, chẳng hạn như ls **/*. Txt (tìm tất cả các tệp văn bản), ls -d *(D) (hiển thị tất cả các tệp bao gồm cả những tệp bắt đầu bằng "."). Để tìm hiểu thêm, hãy truy cập man zshexpn, phần "TẠO PHIM TÊN".

# superglobs
setopt extendedglob
unsetopt caseglob

Điều này rất hữu ích để ghi nhớ các lệnh trong lịch sử của bạn mà không thực hiện chúng.

setopt interactivecomments # pound sign in interactive Prompt

Nhập ".." thay vì "cd ..", "/ usr/include" thay vì "cd/usr/include".

setopt auto_cd

Nhắc nhở tốt đẹp.

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

Hiển thị số liệu thống kê sử dụng CPU cho các lệnh mất hơn 10 giây

REPORTTIME=10

Một số lệnh bạn sử dụng rộng rãi trong 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'

Liệt kê các gói được sắp xếp theo kích thước của chúng - hữu ích khi quyết định gói nào chiếm dung lượng đĩa của bạn.

function apt-list-packages {
  dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | grep -v deinstall | sort -n | awk '{print $1" "$2}'
}
94
loevborg

Tôi muốn giới thiệu cuốn sách Từ bash đến Z Shell . Nó có tất cả lời khuyên bạn cần cho việc chuyển đổi Shell của bạn. Nó giải thích sự khác biệt của cả hai vỏ và giúp dễ dàng cho một zsher mới.

14
qbi

Đây là . Zshrc của tôi và đó là điều quan trọng nhất! zsh có rất nhiều tùy chọn bạn có thể sử dụng, vì vậy hãy xem một số ví dụ trên mạng hoặc đọc tài liệu tại trang chủ Zsh .

.Sshshrc của tôi không chứa bất kỳ thứ gì thực sự thú vị ngoài dấu thời gian ở bên phải của dòng lệnh.

Btw, hãy nhớ thử dùng thẻ phàn nàn mỗi khi một vài ví dụ ở đây:

mplayer -a[tab]

sẽ hiển thị một cái gì đó như thế này:

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

Và nếu bạn sử dụng ssh-key hoặc ssh-agent không mật khẩu, bạn có thể thấy nó hữu ích với các tệp từ xa đầy đủ:

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

Sau khi nhận được danh sách, bạn có thể nhấn tab nhiều lần hơn để duyệt qua các khả năng khác nhau.

Nhưng được cảnh báo, Shell này sẽ khiến bạn lười biếng và khiến bạn cảm thấy rằng một Shell tiêu chuẩn là ngu ngốc và gây phiền nhiễu!

8
LassePoulsen

Một vài quả cầu mở rộng đặc biệt hữu ích:

1- rmdir *(/^F) - xóa tất cả các thư mục không trống trong thư mục hiện tại

2- grep traceback /srv/log/**/*(.m-2) - hãy tìm regex này trong các tệp được sửa đổi trong hai ngày qua

3- chmod g+w **/*(U^I) - làm cho bất kỳ tệp nào thuộc sở hữu của tôi và không thể ghi theo nhóm có thể ghi theo nhóm

Có, tất nhiên bạn có thể viết cái này với find nhưng điều này dễ dàng hơn để thoát ra. Nó có hai nhược điểm, công bằng mà nói, cả hai đều được mở rộng trên dòng lệnh: nếu nó khớp với hàng ngàn tệp thì dòng lệnh sẽ quá dài và điều này sẽ thất bại, và thứ hai là tất cả các tệp được tìm thấy trước khi tập tin bắt đầu chạy.

(Bạn sẽ cần setopt extendedglob nếu chưa bật)

5
poolie

Tôi không biết nhiều về bash, vì vậy tôi không thể tính toán được. Một số đoạn trong tệp cấu hình zsh của tôi.

Một số cấu hình

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 trong lời nhắc

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

Một số phím nóng, chèn vào đầu dòng một số văn bản.

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

Các hàm, tôi lưu trữ sau đó trong ~/.zsh/Hàm

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

Một số tùy chọn 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.]"
}
4
Pedro

Tôi đang ở trong cùng một chuyến đi :)

Cho đến nay tôi đã thấy rằng điều cần có là một tệp cấu hình tốt (.zshrc).

Lấy ví dụ này làm ví dụ http://matt.blissett.me.uk/linux/zsh/zshrc , xem các bình luận và hack theo cách của bạn. Stackoverflow và severphault và những nơi tốt để tìm kiếm quá.

Tôi vẫn chưa đi sâu vào http://dotfiles.org/.zshrc , nhưng tôi không có nhiều thời gian để mất :)

3
tutuca

Tìm hiểu về Globing mở rộng và đệ quy trong zsh.

Tìm hiểu một chút về zstyle và cách mọi thứ khác nhau (đặc biệt là hoàn thành) cho phép bạn điều chỉnh cấu hình của chúng bằng zstyle.

Nhìn vào các mảng kết hợp. Ngoài ra các mảng tiêu chuẩn (hãy cẩn thận với sự khác biệt từ bash, để tốt hơn!)

Nếu bạn sử dụng biểu thức thông thường, hãy xem =~ (bash cũng có) và xem xét: setopt rematch_pcre

Tránh viết các tập lệnh phụ thuộc vào nhiều hơn một chút phép thuật của zsh, bởi vì trong khi nó rất tuyệt để sử dụng, zsh có thể có xu hướng chỉ viết. Nếu bạn đang sử dụng quá nhiều, hãy nghĩ đến khi nào nên chuyển sang ngôn ngữ như Python.

Zsh thật quyến rũ. Đó là mặt tối. Chào mừng bạn.

3
Phil P

Lợi ích lớn - hoàn thành tab tuyệt vời với các kịch bản hoàn thành đóng gói sẵn cho nhiều lệnh. Dưới đây là một ví dụ hiển thị đầu ra của apt-get<TAB>:

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

Tôi đã đưa ra một cuộc đàm phán và chuyển đổi một số người sang zsh. Tôi giữ một repo github các ghi chú (lợi thế của tôi) cùng với cả bộ khởi động và bản sao cấu hình zsh của riêng tôi trong github ở đây.

http://github.com/mitechie/zshrc

1
Rick

Một tài nguyên tuyệt vời khác là trang những người yêu thích zsh (đến từ trang web zml grml ).

0
qbi