zsh를 칭찬하는 게시물을 자주 접할 때 bash에서 zsh로 이동하는 것을 고려하고 있습니다. 나는 경험이 풍부한 커맨드 라인 사용자이며 기본 사항이 거의 동일하다고 가정하므로 이동의 이점을 얻고 조언을 구해야합니다.
답변 당 하나의 조언 만 제공하십시오. 나는 한 번에 모든 것을 배우려고 노력하기보다는 돌아와서 여분의 정보 비트를 쉘 사용에 일정한 속도로 통합 할 수있는 한입 크기의 청크를 찾고 있습니다.
zsh를 칭찬하는 게시물을 자주 접할 때 bash에서 zsh로 이동하는 것을 고려하고 있습니다. 나는 경험이 풍부한 커맨드 라인 사용자이며 기본 사항이 거의 동일하다고 가정하므로 이동의 이점을 얻고 조언을 구해야합니다.
답변 당 하나의 조언 만 제공하십시오. 나는 한 번에 모든 것을 배우려고 노력하기보다는 돌아와서 여분의 정보 비트를 쉘 사용에 일정한 속도로 통합 할 수있는 한입 크기의 청크를 찾고 있습니다.
답변:
당신이 말했듯이, 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}'
}
나는 bash에서 Z Shell까지 책을 추천한다 . 쉘을 전환하는 데 필요한 모든 조언이 있습니다. 두 쉘의 차이점을 설명하고 새로운 zsher를 쉽게 사용할 수 있습니다.
여기 내 .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을 여러 번 눌러 다른 가능성을 순환 할 수 있습니다.
그러나이 껍질은 당신을 게으르게하고 표준 껍질이 어리 석고 짜증나게한다고 느낄 것입니다!
특별히 유용한 확장 글로브 2 개 :
1-- rmdir *(/^F)
현재 디렉토리 아래의 비어 있지 않은 디렉토리를 모두 삭제하십시오.
2 grep traceback /srv/log/**/*(.m-2)
- 지난 이틀 동안 수정 된 파일이 정규식을 찾아
3-- chmod g+w **/*(U^I)
내가 쓸 수 있고 그룹 쓰기 가능하지 않은 파일을 그룹 쓰기 가능하게 만들기
예, 물론 이것을 쓸 수는 find
있지만 이것은 더 쉬워집니다. 공평하게 말해서 모두 명령 줄로 확장되는 것과 관련하여 두 가지 단점이 있습니다. 수천 개의 파일과 일치하면 명령 줄이 너무 길어지고 실패하고 두 번째로 모든 파일이 발견됩니다 파일이 실행되기 전에
( setopt extendedglob
아직 켜져 있지 않으면 필요 합니다)
나는 배쉬에 대해 많이 알지 못하므로 경쟁 할 수 없다. 내 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.]"
}
나는 같은 여행에있다 :)
지금까지 나는 좋은 구성 파일 (.zshrc)을 가지고 있다는 것을 알았습니다.
이것을 http://matt.blissett.me.uk/linux/zsh/zshrc 예제로 가져 와서 주석을보고 해킹하십시오. Stackoverflow와 Severphault 및 검색하기에도 좋은 장소.
아직 http://dotfiles.org/.zshrc 에 들어 가지 않았지만 느슨하게 할 시간이 많지 않습니다. :)
zsh의 확장 된 globbing 및 재귀 glob에 대해 학습하십시오.
zstyle과 zstyle을 사용하여 다양한 구성 (특히 완료)을 사용하여 구성을 조정하는 방법에 대해 조금 배우십시오.
연관 배열을 살펴보십시오. 또한 표준 배열 (bash와의 차이점에주의하십시오)
정규 표현식을 사용하는 경우 =~
(bash도 가지고 있음)을 살펴보고 다음을 고려하십시오.setopt rematch_pcre
환상적인 zsh는 쓰기 전용 인 경향이 있기 때문에 zsh의 마법에 의존하는 스크립트는 작성하지 마십시오. 너무 많이 사용하는 경우 파이썬과 같은 언어로 언제 전환해야하는지 생각해보십시오.
Zsh는 매혹적입니다. 어두운면입니다. 어서 오십시오.
나는 대화의 쿠페를주고 여러 사람들을 zsh로 전환했습니다. 여기에 github의 시작 및 자체 zsh 구성 사본과 함께 내 (이점은 무엇입니까) 메모의 github 저장소를 유지하십시오.
또 다른 훌륭한 리소스는 zsh lovers 페이지입니다 ( grml zsh site에서 제공 ).