===== zsh - the Z shell ===== 여기 저기 [[http://zsh.org|zsh]]에 대한 소개를 바탕으로 정리 했습니다. ==== 0. zsh로 들어가기 ==== Unix로 대표되는 콘솔의 커맨드형 입력문화는 쉘이 그 대표를 하고 있습니다. 쉘의 캐릭터 라인은 자연언어와 비슷하고 기호적이여서 풍부한 표현을 할 수 있습니다. 맥킨토시를 사랑하고 GUI를 좋아하지만 쉘과 같은 캐릭터라인(CUI)에의한 인터페이스는 어떤 ??의 감동과 미학을 느끼게하며 무엇보다 편리합니다. 따라서 시스템과의 커뮤니케이션을 원활히 하기 위해서는 쉘의 표현능력을 길러야 합니다. Unix기본인 (T)csh이나 리눅스에서 많이 쓰이는 bash를 사용하지만, zsh(z shell)에 대해 소개 하겠습니다. 무쟈게 편합니다. 편리함은 익숙함이고 선택사항이기 때문에 모든 사람에게 zsh을 사용하라 권하진 않습니다. 다만 zsh을 사용함으로써 보다 편하고 시스템과의 효과적인 커뮤니케이션을 할 수 있기 때문입니다. ==== 1. zsh의 특징 ==== zsh은 sh, csh, tcsh, bash 등의 다른 모든 쉘의 기능을 사용가능하며 '마지막 쉘'라고 하는 의미로 zsh 이라 합니다. * csh 형(csh, tcsh) * sh 형(sh, ksh, bash, zsh) zsh은 8bit clean을 지원합니다. 한글을 쓸려면 [[http://hangul.kldp.org|패치]]를 해야합니다. zsh은 tcsh을 대부분 지원하며 zsh의 기능을 쓴다면 스크립트 작성에서 좀더 간결한 표현을 할 수 있습니다. ==== 2. zsh의 기능 ==== zsh에서 특별히 유용하다고 생각하는 기능만 간추렷습니다. * 프로세스 <--> 파일치환 * complition * 간단한 CD(Change Directory) * 커맨드라인스택(방향키로 전의 명령을 가져온다?) ==== 2.1 프로세스-파일의 치환 ==== zsh에서 ''=(command)' 는 command를 실행하고 그결과를 파일로 보낼는데 사용합니다. % vi=(finger) finger의 내용을 vi로 편집합니다. % sort +2 -n data1 > data1_sort % sort +2 -n data2 > data2_sort % compare.pl data1_sort data2_sort 은 zsh위의 기능을 사용하면 아래와 같습니다. % compare.pl =(sort +2 -n data1) =(sort +2 -n data2) 참 편리하죠? '='는 간단하게 처리하는데 유용합니다. '=command'는 실제path의 command를 나타냅니다. 한번 해보도록 하죠 % echo =ls (ls의 실제 위치를 표시 which와 다르며 alias를 무시한다.) % vi =startx (패스가 걸린 startx를 vi로 편집합니다) ==== 2.2 file selection ==== 보통 쉘에서 .sh 만 출력할때 % ls *.sh 이렇게 하는데 zsh은 뒤에 ()를 붙여서 '''속성'''을 지정합니다(설명이 좀 그러죠? 예제를 보도록 하죠!) % chmod 755 ''ls -l * | awk '/^...x/{ print $9 }''' awk를 사용하여 ''x''이름으로 끝나는 파일의 속성을변하게(chmod) 하는 command입니다 흐흐 그런데 zsh에서는 -_-)v 다음과 같습니다 % chmod 755 *(x) 그외에도 zsh의 막강한 파일관리는 감동입니다. * a로 시작되는 디렉토리 : a*(/) * .bashrc 나 .vimrc 같은 프로그램 시작환경 화일 : .*(.) * 현재 디렉토리 아래의 파일의 선택은 : **/* ==== 2.3 cd(change directory) ==== 드디어 왔구나..gui환경에서 cui환경으로 넘어오는 유저들중에 가장 불편하게 생각하는 부분이 cd입니다. 물론 cui환경에 익숙해지면 너무 편한기능이 도지만.. bash의 기능은 pushd와 popd 를 사용하여 cd를 확장할 수 있지만. 쓰다보면 잘 잊어 버리고 조작이 귀찮아져 그냥 안쓰고 맙니다(제가 그랬지요..효영이가 좋다고 했는데) zsh에서는 setopt autopushd(.zshrc에 설정해노면 편리하죠)해두면 cd시 자동으로 pushd를 실행합니다. 이걸 응용하겟습니더..아주 편리하군..gd라고 alias를 겁니다.(먼뜻인지는 알아서 파악) .zshrc에다가 setopt autopushd를 설정하고 alias gd='dirs -v; echo -n "select number: " ; read newdir; cd -"$newdir"' 이렇게 설정 해줍니다. '''.zshrc의 예''' HISTSIZE=200 #history 기능을 사용하기위해 세줄을 추가한다. HISTFILE=~/.zsh_history SAVEHIST=200 PS1=$'%{\e[1;31m%}%{\e[0m%}' # 프롬프트의 모양! setopt autopushd #추가한 부분 alias gd='dirs -v; echo -n "select number: " ; read newdir; cd -"$newdir"' #추가한 부분 그럼 사용해보도록 하죠. % cd /foo % cd /usr/local % cd /var/spool/mail % gd 0 /var/spool/mail 1 /usr/local 2 /foo select number: 2[RET] % pwd /foo 흐흐 쓸만하네요. ==== 2.4 command line stack ==== 요거 물건입니다. 컴파일할때나 또는 뮤자게 긴 커맨드를 입력했는데,깜박하고 그전에 했어야할 커맨드를 입력하지 않은것입니다..요럴때 사용하지요.. 그럼 다음의 예와 함께 살펴보도록 하죠. % gcc -o foo -O foo.c -lm -lnsl -lsocket -l 아..-_- foo.c위치가 여기가 아니지 아.나 zsh쓰지(ㅋㅋ) 그러면 M-q(or ESC-q)를 입력하면 % _ 이렇게 커맨드를 stack에 저장하지...그리고 foo.c의 위치를 제대로 찾아야지.. % cd /usr/local/src foo.c가 있는곳으로 이동한고 엔터를 치면 M-q로 stack에 저장했던 command가 나타납니다(흐흐 예수의부활!) 음..이와 관련된 팁으로 man이나 help페이지를 볼때 man command 치기 귀찮죠? zsh에서는 % command[M-h] 이렇게 command 치구 M-h를 누루면 man command와 동일합니다. ==== 응용 팁 ==== 1. cd를 치기 귀찮아~ '' setopt auto_cd 하면 디렉토리면 쳐도 된다 '' 2. dak.o 이외의 *.o를 전부 지울꼬야~ dak.o는 지우면 안대지~ '' rm *.o~dak.o '' 3. 현 디렉토리 이하의 *.orig과 symlink를 지우구 시포~(find와 awk쓰기 시른데..) '' * rm **/*. orig(m+30) **/*(@)'' (setopt extended_glob해둔다.) 4. ./configure --libraries=/lib/include --prefix=/usr/local/dak 을 쳤는데 - 앗.config.h를 편집해야지 -_-했는데 제길 퍼미션..흐흐 그래서 chmod +w config.h 하고 다시 vi config.h -_-앗..ㅜ_ㅠ 다시 처음으로 ./configure 를 ..쳐야지..흑흑..귀찮아.. ''./.configure --libraries=/lib/include --prefix=/usr/local/dak 하고 아! [M-q] 하고 vi config.h 하고 아! 또 [M-q] chmod +w config.h 하면 vi config가 프롬프트에 자동으로 뜬다 ..편집하고 ZZ 종료 ..하고 나오면..헉! ./configure --libraries=/lib/include --prefix=/usr/local/dak 가 프롬프트에 자동으로 뜬다..ㅜ_ㅠ 엔터.! '' 5. file ''which ls''를 간단히? ''* file =ls'' 6. fix-01.gz ~ fix-11.gz 중에서 4~10만 패치하고 시포 ''gzcat fix-<4-10>.gz | patch -p'' 편리하군! 멋지군! 7. a000 ~ a255 라는 파일을 만들고 시포 ''touch a{000..255}'' {from..to}와 하면 from로부터 to까지 숫자가 만들어 집니다. {00..02} 와 하면00 01 02 가 생긴다. 흐흐 멋져(!) 8. rm -rf dir[TAB] -> rm -rf directory/ 가 된다 '/'가 붙으면 rm이 rmdir을 해주지 않아서 일일이 /를 지워준다. (bash에서는 관련이 없는 내용이다) ''setopt auto_remove_slash'' 하면 자동으로 '/'를 지워준다. 9. pushd를 많이 사용해서 dirs을 실행하면 /foo/bar 3개이상 있을때 .-_-; ''setopt pushd_ignore_dups'' 하면 pushd한 디렉토리가 겹치지 않는다. pushd 많이 해도 정리해준다. 10. .zshrc 가 에러나면 zsh은 어느파일의 어느 행이 에러인지 표시해준다.(.cshrc는 곤혹이다) 11. zsh은 foreach의 루트안에 돌아가는 것들을 history에 기록합니다. 12. "" 안에 "를 쓸수 있습니다(bash도 가능? 쓸일이 별로 없어서~) 13. 프롬프트를 좀더 멋지게 할 수 없나요? ''zsh는 RPROMPT라는 변수로 오른쪽에 prompt를 설정할 수 있습니다. RPROMPT는 위치에 대한 정보를 보여주며 각command 화면의 가독성을 높입니다.'' PROMPT="%U$USER@%m%%%u " RPROMPT="[%~]" 14. setopt hist_ignore_space 이옵션을 켜두면 커맨드라인 앞에 스페이스를 넣어두면 history에 기록되지 않습니다. 15. ./myprogram |./myfilter 와 같은 pipe커맨드 또는 alias커맨드를 실행할때 time에 관한 옵션을 넣을수 있나요?(tcsh과 비교) (실행시간 잴때는 time사용) tcsh% alias la 'ls -a' tcsh% repeat 3 la tcsh% la: command not found. 안된다 ㅜ_ㅠ :-p 물론 zsh의 경우는 zsh% alias la='ls -a' zsh% repeat 3 la . .. . hoge foo . .. . hoge foo . .. . hoge foo 잘된다 ^^ 16. zsh는 ''$[ … ]'' 괄호안을 수식으로 계산 해줍니다. 17. escape sequence 을 모아두는방법 : %{ … } 18. time zsh -c "repeat 10 /tmp/a.out" 수행시간 측정하기. tcsh이랑 zsh는 repeat 명령이 있는데, bash는 없는것인가? repeat를 쓰면 꽤 편리하다. :) 음악 한곡만 반복해서 들을때 특히! ==== 추천옵션 (.zshrc에 넣어두면 편리하죠) ==== man zsh 하면 옵션이 무지 많은데 어떤것이 편리한지 모르겠죠? 그럼 아래와 같이 써보세요.. ### # Set shell options ### setopt auto_menu auto_cd correct auto_name_dirs auto_remove_slash setopt extended_history hist_ignore_dups hist_ignore_space prompt_subst setopt pushd_ignore_dups rm_star_silent sun_keyboard_hack setopt extended_glob list_types no_beep always_last_prompt setopt cdable_vars sh_word_split auto_param_keys ---- [[http://www.gentei.org/~yuuji/rec/pc/zshcompctl|.zshrc]] 다른사람은 어떡게 쓰는지 보세요. ---- zsh은 [[http://www.zsh.org/pub/|여기]]에서 더 많은 정보를 얻을 수 있습니다. [[[[http://zsh.sunsite.dk/Intro/|Introduction|to|ZSH]]]] seealso [[http://dotfiles.com/|.file]] -각종 dot파일 모아났어요. ^^ 유명한 해커들도 많에요. 흐흐 morris chang~