bash에서 zsh로 이동


143

zsh를 칭찬하는 게시물을 자주 접할 때 bash에서 zsh로 이동하는 것을 고려하고 있습니다. 나는 경험이 풍부한 커맨드 라인 사용자이며 기본 사항이 거의 동일하다고 가정하므로 이동의 이점을 얻고 조언을 구해야합니다.

답변 당 하나의 조언 만 제공하십시오. 나는 한 번에 모든 것을 배우려고 노력하기보다는 돌아와서 여분의 정보 비트를 쉘 사용에 일정한 속도로 통합 할 수있는 한입 크기의 청크를 찾고 있습니다.


8
우분투의 command-not-found를 zsh와 통합 할 수 있는지 알고 싶습니다. 나는 이것 때문에 (그리고 다른 많은 성가신) bash로 다시 바꿨다.
Marius Gedminas


두 가지 흥미로운 링크 : " ZSH FAQ" zsh.sourceforge.net/FAQ & " ZSH 는 당신의 친구입니다" 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'

"word"의 정의를 변경합니다 (예 : ^ 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

ls ** / *. txt (모든 텍스트 파일 찾기)와 같이 모든 종류의 확장 글 로빙을 활성화합니다 ( ls -d *(D)"."로 시작하는 파일을 포함한 모든 파일 표시). 자세한 내용을 보려면 man zshexpn"FILENAME GENERATION"섹션으로 이동 하십시오.

# superglobs
setopt extendedglob
unsetopt caseglob

이 명령은 실행 기록없이 명령을 기억하는 데 유용합니다.

setopt interactivecomments # pound sign in interactive prompt

"cd .."대신 "..", "cd / usr / include"대신 "/ usr / include"를 입력하십시오.

setopt auto_cd

좋은 프롬프트.

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

10 초 이상 걸리는 명령에 대한 CPU 사용 통계 표시

REPORTTIME=10

우분투에서 광범위하게 사용하는 일부 명령.

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!
Triptych

2
[ github.com/robbyrussell/oh-my-zsh](oh-my-zsh) 와 같이 zsh에 많은 플러그인을 추가 할 수도 있습니다 .
RedPixel

14

나는 bash에서 Z Shell까지 책을 추천한다 . 쉘을 전환하는 데 필요한 모든 조언이 있습니다. 두 쉘의 차이점을 설명하고 새로운 zsher를 쉽게 사용할 수 있습니다.


이 책은 bash와 zsh 사용자 모두에게 좋습니다. 각 챕터가 "bash와 zsh 모두이 모든 것을 할 수있다"로 시작하는 방법을 좋아해야한다. 그리고 또 다른 30 페이지의 "zsh만의 것들이있다"
Rick

8

여기 내 .zshrc가 있으며 이것이 가장 중요합니다! zsh에는 사용할 수있는 옵션이 많으므로 인터넷 주변의 모든 예제를 보거나 Zsh 홈페이지 에서 설명서를 읽으십시오 .

내 .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-keys 또는 ssh-agent를 사용하는 경우 원격 파일을 tabcomplete하는 것이 유용 할 수 있습니다.

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

목록을 얻은 후 tab을 여러 번 눌러 다른 가능성을 순환 할 수 있습니다.

그러나이 껍질은 당신을 게으르게하고 표준 껍질이 어리 석고 짜증나게한다고 느낄 것입니다!


5

특별히 유용한 확장 글로브 2 개 :

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='*?_-[]~\!#$%^(){}<>|`@#$%^*()+:?'

프롬프트에서 힘내

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.]"
}

3

나는 같은 여행에있다 :)

지금까지 나는 좋은 구성 파일 (.zshrc)을 가지고 있다는 것을 알았습니다.

이것을 http://matt.blissett.me.uk/linux/zsh/zshrc 예제로 가져 와서 주석을보고 해킹하십시오. Stackoverflow와 Severphault 및 검색하기에도 좋은 장소.

아직 http://dotfiles.org/.zshrc 에 들어 가지 않았지만 느슨하게 할 시간이 많지 않습니다. :)


3

zsh의 확장 된 globbing 및 재귀 glob에 대해 학습하십시오.

zstyle과 zstyle을 사용하여 다양한 구성 (특히 완료)을 사용하여 구성을 조정하는 방법에 대해 조금 배우십시오.

연관 배열을 살펴보십시오. 또한 표준 배열 (bash와의 차이점에주의하십시오)

정규 표현식을 사용하는 경우 =~(bash도 가지고 있음)을 살펴보고 다음을 고려하십시오.setopt rematch_pcre

환상적인 zsh는 쓰기 전용 인 경향이 있기 때문에 zsh의 마법에 의존하는 스크립트는 작성하지 마십시오. 너무 많이 사용하는 경우 파이썬과 같은 언어로 언제 전환해야하는지 생각해보십시오.

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          


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.