레이블이 zsh인 게시물을 표시합니다. 모든 게시물 표시
레이블이 zsh인 게시물을 표시합니다. 모든 게시물 표시

nvm slow start

# zsh 시작이 오래 걸리는 문제가 있다.
# zprof(bulitin) 모듈을 추가해 zsh 시작을 프로파일링 해보자.
# ~/.zshrc 첫번째 라인
zmodload zsh/zprof
# ~/.zshrc 마지막 라인
zprof

# 이제 zsh 를 시작하면 다음과 같이 처리시간이 큰 커맨드를 확인할 수 있다. 
zsh
num  calls                time                       self            name
-----------------------------------------------------------------------------------
 1)    1        1413.91  1413.91   93.77%    532.48   532.48   35.31%  nvm_auto
 2)    2         881.44   440.72   58.45%    468.15   234.08   31.05%  nvm
 3)    1         349.74   349.74   23.19%    309.31   309.31   20.51%  nvm_ensure_version_installed
 4)    1          63.34    63.34    4.20%     49.80    49.80    3.30%  nvm_die_on_prefix
 5)    5          92.76    18.55    6.15%     41.40     8.28    2.75%  pmodload
 6)    1          40.43    40.43    2.68%     40.43    40.43    2.68%  nvm_is_version_installed
 7)    1          15.33    15.33    1.02%     15.33    15.33    1.02%  compinit
 8)    1          13.19    13.19    0.87%     13.19    13.19    0.87%  nvm_grep
 9)    1           9.20     9.20    0.61%      9.00     9.00    0.60%  _zsh_highlight_load_highlighters
10)    2           7.27     3.63    0.48%      7.27     3.63    0.48%  promptinit
11)    2          11.93     5.97    0.79%      6.86     3.43    0.45%  prompt_sorin_ysoftman_setup

# nvm.sh 의 nvm_auto(), nvm(), nvm_ensure_versin_installed() 이 오래걸린다는걸 알 수 있다.
# --no-use 를 옵션을 사용해 로딩하면 nvm 명령은 사용할 수 있지만 새로운 쉘 시작시 항상 system node 가 되어
# 특정 node 버전이 필요한 경우 nvm use v{버전} 으로 변경해야 하는 수고가 있다.
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" --no-use

# 관련해서 이슈가 있고 nvm lazy 로딩등을 얘기하는데 아직 정식으로 해결되진 않았다.

zsh Parameter Expansion Flags

#!/bin/bash
#!/bin/zsh

# 다음과 같은 스크립트가 있을때
a="a
b
c
d e f"

cnt=0
for i in $a; do
    ((cnt++))
    echo "[cnt:$cnt] $i"
done

# bash 로 실행하면 newline, space 로 구분해 다음과 같은 결과를 얻을 수 있다.
# bash ./parameter_expansion_flags.zsh
# [cnt:1] a
# [cnt:2] b
# [cnt:3] c
# [cnt:4] d
# [cnt:5] e
# [cnt:6] f

# zsh ./parameter_expansion_flags.zsh
# zsh newline 으로 구분하지 않아 loop 가 한번만 실행되고 다음과 같이 하나로 출력 된다.
# [cnt:1] a
# b
# c
# d e f
echo "-----"

# 다음과 같이 Parameter Expansion Flags 중 f 를 명시해야 된다.
# f : Split the result of the expansion at newlines. This is a shorthand for ‘ps:\n:’.
# zsh 에선 동작하지만 bash 에서는 에러가 발생한다.
cnt=0
for i in ${(f)a}; do
    ((cnt++))
    echo "[cnt:$cnt] $i"
done

echo "-----"

# 다음과 같이 for 에서 사용하면 bash, zsh 모두 사용할 수 있다.
for i in $(echo $a); do
    ((cnt++))
    echo "[cnt:$cnt] $i"
done

ls dot file with glob, create/delete dash file

# .(dot, hidden) 파일을 *(glob) 으로 bak 으로 끝나는 파일을 조회시
# 다음과 같이 하면 조회가 안된다.
ls *bak
zsh: no matches found: *bak
# 모든 파일 보기 옵션인 -a 옵션을 사용해도 glob 으로는 안된다.
ls -a *bak
zsh: no matches found: *bak

# . 파일을 glob 으로 조회할때면 다음과 같이 . 으로 시작한 후 glob 을 사용해야 한다.
ls .*bak
exa .*bak
lsd .*bak

#####

# dash('-') 로 시작하는 파일명 생성
# -- 이후부터는 - 옵션이 없음
touch -- '-a -b -c'

# 또는
touch ./'-a -b -c'

# - 로 시작하는 파일명 삭제
rm -- '-a -b -c'

# 또는
rm ./'-a -b -c'

mac builtin command manual page

# mac 환경에서 cd, alias, if 등의 builtin command 의
# manual-page(man page) 는 표시되지 않는다.
# 다음과 같이 cd 명령 설명을 보려고 하면
builtin 에 대략적인 설명 문서만 보인다.
man cd

# bash 를 사용한다면 help 로 설명서를 볼 수 있다.
help cd

# zsh 에는 help 를 사용할 수 없고, run-help 를 사용해야 하는데
# run-help=man 으로 alias 되어 있다.
# run-help alias 를 풀어주고(alias 안되어 있을 수도 있어 stderr null 처리)
unalias run-help 2> /dev/null

# zsh 의 autoloading function 으로 run-help 를 다시 로딩한다.
autoload run-help

# 이제 run-help 로 builtin command 설명서를 볼 수 있다.
run-help cd

#####

# man page 나 --help 로 보이는 문서는 자세하지만 길고,
# 예시도 없어 차근차근 읽어 이해하는데 시간이 걸리는데 
# tldr(too long dont' read)을 사용하면 실제 사용 예시등으로 빨리 파악할 수 있다.

# 설치
npm install -g tldr

# mac 에선 brew 로도 설치 할 수 있다.
brew install tldr

# ls 사용방법 보기
tldr ls

zsh noglob alias

# zsh 환경에서 rsync, scp 사용시 *.txt 와 같은 glob (또는 wild) 표현이 동작하지 않는다.

rsync *.txt ./a
*.txt" failed: No such file or directory (2)

scp *.txt ./a
cp: *.txt: No such file or directory

# zsh 에서 다음과 같은 명령들을 noglob 으로 alias 해놨기 때문이다.
alias | rg noglob
bower='noglob bower'
fc='noglob fc'
find='noglob find'
ftp='noglob ftp'
globurl='noglob urlglobber '
history='noglob history'
locate='noglob locate'
rake='noglob rake'
rsync='noglob rsync'
scp='noglob scp'
sftp='noglob sftp'


# \로 alias 를 사용하지 않던가
\rsync *.txt ./a
\scp *.txt ./a


# unalias 를 해야 된다.
unalias bower 2> /dev/null
unalias fc 2> /dev/null
unalias find 2> /dev/null
unalias ftp 2> /dev/null
unalias globurl 2> /dev/null
unalias history 2> /dev/null
unalias locate 2> /dev/null
unalias rake 2> /dev/null
unalias rsync 2> /dev/null
unalias scp 2> /dev/null
unalias sftp 2> /dev/null

wsl bash completion is too slow

# wsl(windows subsystem for linux) 의 bash 탭으로 파일 자동 완성을 시도하면 너무 오래걸리는 문제가 있다.
bash ./a탭... 한참 후 파일 자동완성

# 터미널을 하나 더 열어 이전 터미널의 bash 탭 동작의 system call 을 살펴보면
# /mnt/c/windows 경로들의 수많은 파일들을 찾고 있는 것을 볼 수 있다.
strace -p 이전터미널pid

# path 환경변수 설정에 /mnt/c/windows 경로가 포함되어 있는 것이 문제였다.
echo $PATH
/mnt/c/Program Files/Intel/iCLS Client/:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/
...

# path 에서 /mnt/c/windows... 경로들을 빼고 재설정하면 빠르게 자동완성 된다.

# 이 이슈가 등록되어 있고,
# 배포판(ubuntu 등)의 /etc/wsl.conf 파일을 생성하고 다음 옵션값을 설정하면
# /mnt/c/window 등 윈도우 경로들이 추가되지 않는다.
sudo vi /etc/wsl.conf
[interop]
appendWindowsPath=false

# cmd -> wsl 배포판 상태를 확인
C:\Users\Administrator>wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         2

# 배포판을 terminate 시킨다.
C:\Users\Administrator>wsl -t ubuntu-18.04

# 이제 wsl 배포판(ubuntu)를 다시 시작하면
# path 환경변수에서 윈도우 경로가 빠져있고 bash 자동완성이 빠르게 동작한다.

# appendWindowsPath=false 옵션으로 윈도우 관련 경로들이 제외됐기 때문에
# wsl 에서 vscode 를 code . 실행을 위해선 아래 경로를 추가해야 한다.

kerberos 패스워드 입력 문제

# mac + iterm2 + zsh(prezto) 환경에서
# 터미널을 오래동안 열어두고 사용하다 보면 어느순간 부터
# kerberos 패스워드 입력이 안되는 경우가 발생한다.
ysoftman@ysoftmanMac ~/workspace/❯ kinit ysoftman
ysoftman@ysoftman-company.com's password:
kinit: failed to read password
ysoftman@ysoftmanMac ~/workspace/❯ mypassword
zsh: command not found: mypassword

# stdin 입력을 테스트 해보면 이상은 없어 보인다.
ysoftman@ysoftmanMac ~/workspace/❯ read a
ysoftman input test
ysoftman@ysoftmanMac ~/workspace/❯ echo $a
ysoftman input test

# iterm 은 닫지 않고 bash 또는 zsh 쉘을 시작해도 같은 문제가 발생하고
# iterm 로 새 터미널을 시작하면 패스워드가 입력된다.
# mac 기본 kint
which kinit
/usr/bin/kinit

# 버전을 보면 오래 된것 같아
kinit --version
kinit (Heimdal 1.5.1apple1)
Copyright 1995-2011 Kungliga Tekniska Högskolan
Send bug-reports to heimdal-bugs@h5l.org

# 새 버전(1.18.2)을 설치 해봤다.
brew install krb5

# 새 버전의 kinit 을 사용하면 패스워드 입력이 잘 된다.
/usr/local/opt/krb5/bin/kinit

# 원래 맥에서 기본 제공하는 /usr/bin/ 의 curl,kinit 같은 프로그램은
# brew link --force 로도 /usr/local/bin/ 에 링크 생성을 못해
# PATH 환경변수에 /usr/local/opt/ 를 추가해야 한다
# export PATH=/usr/local/opt/krb5/bin:$PATH
# 하지만 다음과 같이 /usr/local/opt/krb5/bin/kinit 가 우선하는 상황에서
which -a kinit
/usr/local/opt/krb5/bin/kinit
/usr/bin/kinit

# /usr/local/opt/krb5/bin/kinit 를 사용하면 ssh 접속시 암호를 물어보는 등의 문제가 발생했다.
# 이런 문제로 /usr/local/opt/krb5/bin/kdestroy 하고 원래의 /usr/bin/kinit(klist,kdestroy) 를 사용해야 했다.

안드로이드폰 termux 사용

# 안드로이드폰으로 터미널 환경을 구성해 보자
# 준비
# 키보드(USB) 를 OTG 를 통해 폰에 연결한다.
# 안드폰에 termux 앱을 설치하자.
# termux는 aarch64(ARM 용으로 포팅한 64bit arch linux) 기반으로
# 패키지 관리자로 apt 또는 pkg(apt를 래핑)를 사용한다.
https://play.google.com/store/apps/details?id=com.termux&hl=en

# 참고로 키보드 사용시 단축키는 윈도우(리눅스)를 생각하면 된다.
alt + tab : 앱(전환)
alt + d : chrome 주소표시줄 포커싱
등등..

# termux 실행 후 필요한 패키지 설치
pkg update && pkg upgrade
pkg install -y zsh python2 python vim rust golang ripgrep curl git tig fzf tmux cmake ctags lua53 fortune cowsay figlet cmatrix golang ruby openssh libandroid-support man lsd dnsutils
pkg install -y vim-python
gem install lolcat

# 기본 zsh 로 변경
chsh -s zsh

# termux 스샷~


# /etc 에서 설정하는 파일들(krb5.conf, resolve.conf ... 등)은 ../usr/etc/ 에 위치한다.
# 만약 ../usr/etc/krb5.conf 설정 후 kinit 시 다음과 같은 에러가 발생한다면
kinit : Cannot contact any KDC for realm 'ysoftman.com' ...

# 각 서버의 디폴트 포트는 다음과 같고 포트까지 명시해보자
kdc = kauth.ysoftman.com:88
admin_server = kadmin.ysoftman.com:749
kpasswd_server = kadmin.ysoftman.com:464 # on UDP

# oh-my-zsh 를 사용하는 경우 powerline 폰트 하나
를 ~/.termux/font.ttf 파일로 생성해야 한다.
cp -v fonts/Hack/Hack-Regular.ttf ~/.termux/font.ttf

# known issue
- 아직 한국어를 지원하지 않고 오직 영어만 된다. 이슈를 줄이기 위해서라는데.. 흠. https://github.com/termux/termux-packages/issues/2796#issuecomment-424589888
- oh-my-zsh 는 동작하지만, prezto 는 zsh 시작시 모듈 로딩을 못하는 문제가 있다.
- vim plugin 중 youcomplteme 는 python 이 포함된 vim 을 사용해야 하는데
apt 로 설치되는 vim 은 python 으로 빌드된 것이 아니라 별도로 vim-python 도 설치해야 한다.

vscode 원격 개발

# vscode 1.35 부터 remote develop extension 을 설치해
# ssh, docker container, wsl 의 원격 개발 환경을 이용 할 수 있다.
# 참고로 아이콘도 좀 심플하게(예쁘게) 변경됐다.~ㅎ

# 원격 접속은 원격 서버의 ${HOME}/.vscode-server 프로그램을 설치하고 vscode-server 가 실행돼 원격으로 접속하게 된다.
# vscode-server 는 wget 로 다운로드를 하게 되는데
# 참고로 사내망이라면 http_proxy 환경 변수를 설정 해줘야 한다.

# docker container 가 이미 떠있는 경우
remote-containers : attach to running container
-> 현재 떠있는 컨테이너 선택 -> 새 vscode 창이 오픈

# 새 vscode 가 생성되면 컨테이너의 소스 파일을 열어 볼 수 있고,
# vscode 터미널에서 빌드 커맨드 등을 실행할 수 있는 상태가 된다.

# remote ssh 는 ~/.ssh/config 와 ~/.ssh/authorized_keys 사용한다.
# kerberos 인증 환경에서도 접속할 수 있다.
# settings.json 설정에 다음을 추가하면 로그인 터미널 상태를 표시해준다.
"remote.SSH.showLoginTerminal": true

# 로그인 터미널에 다음과 같은 에러가 발생하는 경우
channel 2: open failed: administratively prohibited: open failed

# 대상 호스트 서버의 /etc/ssh/sshd_config 에 tcp 포워딩 가능하도록 설정한다.
AllowTcpForwarding yes

# 그리고 sshd 서버를 재시작한다.
sudo systemctl restart sshd

# 기타 접속 이슈 해결방법 참고
https://code.visualstudio.com/docs/remote/troubleshooting#_troubleshooting-hanging-or-failing-connections

# remote develop 기능은 vscode live share(로컬 코드를 공유)와 비슷하지만
# 원격 장비의 코드를 vscode 로 볼 수 있어 좋은것 같다.

(eval):1: command not found 에러

# zsh 환경에서 명령 옵션에 파일을 자동완성하기 위해 tab을 누르면
# 다음과 같은 에러가 발생하는 경우가 있다.
ansible-playbook -i ./in...(eval):1: command not found: _ansible-playbook

# vim 파일 찾기 위해 tab을 누를때도
_arguments:448: _vim_files: function definition file not found

# 고질적인 문제로 해결벙법은 zcomdump 파일을 삭제하고 쉘 다시 시작하면 된다.
rm -fv ~/.zcompdump

git sub(custom)command 사용하기

t-명령이름 으로 실행할 파일을 만들고
vi git-ysoftman
#!/bin/bash
echo "ysoftman's custom git command test"
chmod +x git-ysoftman

# 다음과 같이 명시하면 현재 위치에서는 커스텀 명령이 실행된다.
git ysoftman

# 만약 현재경로에서 git ysoftman 실행시 다음과 같은 에러가 발생하면
git: 'ysoftman' is not a git command.
# GIT_EXEC_PATH 환경변수를 현재디렉토리로 설정해 실행한다.
# https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EB%82%B4%EB%B6%80-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98
GIT_EXEC_PATH=$(pwd) git ysoftman

# 또는
git --exec-path=. br

# 또는
# bash, zsh 등에서 git-subcommand 를 현재 디렉토리에서 실행하기 위해
# PATH 환경변수 처음이나 마지막에 구분자(:)가 있거나
# PATH 중간에 :: 부분이 있어야 한다.
# ./a.sh 대신 a.sh 실행 가능해야 한다.
export PATH=$PATH:

# 또는
export PATH=:$PATH

# 또는
export PATH=/bin::$PATH

# 참고
# 다음 옵션으로 현재 사용중인 command 경로를 알 수 있다.
git --exec-path

# git 명령이 어떻게 수행되는지 trace 해볼 수 있다.
# 2값이상을 주면 open file descriptor 번호로 파악해서 해당 파일로 trace를 기록한다.
GIT_TRACE=2 git ysoftman

zsh nocorrect

# zsh 에서 gcc 는 nocorrect 로 alias 되어 있다고 나오면서 위치가 안나온다.
which gcc
gcc: aliased to nocorrect gcc

# -a 으로 모든 실행 가능한 인스턴스 리스트를 출력하면 보이긴 한다.
which -a gcc
gcc: aliased to nocorrect gcc
/usr/bin/gcc

# zsh 에서 gcc 다음과 같이 alias 하고 있다.
gcc='nocorrect gcc'

# zsh 은 기본적으로 오타에 대해 다음처럼 교정할 수 있다.
cleary
zsh: correct cleary to clear [nyae]?

# nocorrect 를 사용하면 명령어 오타 교정을 물어보지 않고 있는 그대로 수행한다.
# nocorrect cleary
zsh: command not found: cleary

# nocorrect 는 zsh 에서 명령어 앞에 선언하는 수정자로
# gcc 글자에 대해선 스펠 교정을 하지 않게 한다.
http://bolyai.cs.elte.hu/zsh-manual/zsh_5.html#SEC19
which nocorrect
nocorrect: shell reserved word

bash 환경에서 명령줄 vi 스타일로 편집하기

# bash(or zsh)에서 명령줄을 vi 스타일로 편집할 수 있다.
# 다음 명령으로 실행하면
set -o vi

# vi 옵션이 활성화(on)된것을 확인할 수 있다.
set -o | grep vi

# 명령줄을 입력하다가 esc 로 명령모드로 전환해 w, b 로 워드단위로 이동할 수 있다.
# a, i 로 입력모드로 돌아 입력할 수 있다.
# v 로 블럭 지정등 기타 vi 편집 기능을 사용할 수 있다.

# vi 옵션을 비활성화(off)하려면
set -o novi

# 참고
http://linuxcommand.org/lc3_man_pages/seth.html

zsh - prezto 1라인 문자 출력 문제

# zsh 기반의 prezto 쉘을 사용하는데
# 줄바꿈(\n)이 없는 한줄 문자열을 출력할때 보이지 않는 문제가 있다.
# 다음과 같이 \n 없이 실행하면 문자열이 출력되지 않는다.

# -n(newline 없이 출력)옵션을 사용하면 출력되지 않는다.
echo -n "ysoftman"

# c 테스트 코드(bash 에서는 ! 를 빼자)
# 명시적으로  flush 해도 출력되지 않는다.
echo -e "#include <stdio.h> \n int main() { printf(\"abcdefg\"); fflush(stdout); return 0;}" >! zz.c && gcc zz.c && ./a.out

# go 테스트 코드
echo -e "package main\n
import \"fmt\"\n
func main(){\n
        fmt.Print(\"AA\")\n
}" >! zz.go && go run zz.go


# 위 명령어 뒤에 && echo 하면 제대로 나온다.
# curl로 1줄짜리 응답을 받는 경우에도 똑같은 상황이다.
# oh-my-zsh, bash 환경에서는 문제가 없고, 다른 서버의 prezto 에서도 잘된다.

# 원인은 no_prompt_cr (prompt_cr 사용하지 않는다는 의미) 설정해 발생한다.
setopt no_prompt_cr

# prompt_cr 은 zsh 에서 사용하는 옵션으로 cr(carriage return) 을 출력한다.
http://zsh.sourceforge.net/Doc/Release/Options.html#index-NO_005fPROMPT_005fCR

# 다시 prompt_cr 을 사용하면 임시로 되긴 한다.
setopt prompt_cr

# 그런데 같은 이슈가 등록되어 있었고, 이미 해결된 상태다.
https://github.com/sorin-ionescu/prezto/issues/1473
https://github.com/sorin-ionescu/prezto/issues/1426

# 해결은 최신 zprezto 를 설치하면 된다는것.
# prezto 설치 스크립트로 다시 설치하자 상황종료~
https://github.com/ysoftman/myenv
zsh ./installprezto.zsh

터미널에서 디렉토리 히스토리 및 이동

# shell builtin command 중 dirs (directory stack) 을 사용하면 최근 이동한 디렉토리들을 볼 수 있다.
# 자세한 dirs 설명은 https://www.gnu.org/software/bash/manual/html_node/Directory-Stack-Builtins.html

# zsh 은 DIRSTACKSIZE 으로 설정한 크기만큼 스택을 쌓을 수 있다.
set DIRSTACKSIZE=10

# 다음으로 현재까지 이동했던 디렉토리 목록을 스택형식으로 볼 수 있다.
dirs -v
0 ~/workspace/ysoftman
1 ~/workspace/ysoftman/test1
2 ~/workspace
3 ~

# zsh 에서 다음과 같이 스택내의 번호로 사용해 해당 디렉토리 이동할 수 있다.
# 스택 위에서 3번째 ~ 로 이동
cd +3

# 스택 맨아래에서 뒤로 2번째 ~/workspace 로 이동
cd -2

# 참고로 bash 에서는 DIRSTACKSIZE 을 사용할 수 없고 cd [-/+] 등은 사용할 수 없다.

terminal, terminal-emulator, console, shell 차이

쉘(shell)은 확실히 명령 처리 프로그램으로 구분이 가지만 터미널(terminal), 콘솔(console)이라는 용어는 많이 혼용해서 사용하는 것 같다.
뭐 거의 비슷한 의미를 가지고 있지만 정확히 분류하면 다음과 같다.

터미널 = 텍스트 입출력 환경, tty(teletypewriter, 전기 타자기)라고도불린다. 엄밀히는 부팅시 GUI 로 시작하지 않고 CLI 로 진입한 경우를 터미널이라고 하고 GUI 로 환경에서 창을 띄워 터미널을 사용할 수 있는 것을 터미널 에뮬레이터(emulator) 라고 한다.
콘솔 = 물리적 측면에서의 터미널, (초창기 유닉스 장비의 가구 느낌)
쉘 = 커맨드 실행(인터프리터) 프로그램

참고
https://askubuntu.com/questions/506510/what-is-the-difference-between-terminal-console-shell-and-command-line

위 링크에서 초창기 유닉스 시스템 사진을 보면 큰 기계 장치를 일종의 가구에 비유해 콘솔이라를 이름을 붙인것 같다.

ohmyzsh url escape bug

[이슈]
iterm2 를 사용하다 url 스트링을 copy & paste 하면 escape(\) 가 붙는 경우가 발생한다.
처음에는 iterm2 의 paste 설정에 escape 가 활성화되어 발생한줄 알았는데,
"escape shell characters with \" 기능을 비활성화되어 있었다.
iterm2 menu -> edit -> paste special -> advacned paste (opt + cmd + v)


원인은 ohmyzsh 사용에 있었다. (prezto 쉘 환경에서는 발생하지 않는다.)

[해결방법]
찾아 보니 해당 버그는 ohmyzsh 의 노운이슈로 zsh 5.2 + 맥 10.12 에서 발생한다.
https://github.com/robbyrussell/oh-my-zsh/issues/5499

다음 스택오버플로우에 스크립트를 수정하여 해결하는 방법이 명시되어 있다.
https://stackoverflow.com/questions/25614613/how-to-disable-zsh-substitution-autocomplete-with-url-and-backslashes

그냥 다음 버전에 고쳐지기를 기다려 봐야겠당~ㅋ

zsh file exist 에러 처리, heredoc 사용하기

# zsh 쉘을 사용중에 파일을 오버라이트 하는 경우 다음과 같이 에러가 발생힌다.
cat a.txt > ysoftman.txt
zsh: file exists:
ysoftman.txt

# 해결방법1
# >! 로 강제 오버라이트 되도록 할 수 있다.
cat a.txt >! ysoftman.txt

# 해결방법2
# 현재 noclobber 상태 파악
set -o | grep noclobber

# noclobber off 로 설정(clobber on)
set -o clobber
cat a.txt > ysoftman.txt

# 참고
# set -o 옵션명 : 옵션 활성화(on)
# set -o no옵션명 : 옵션 비활성화(off)

#####

# heredoc 사용하기
# zzz 를 입력되기 까지 모든 내용을 cat 입력(<<)으로 받고
# cat 은 입력받은 내용을 stdout으로 출력하는데 > 를 통해 파일에 쓴다.
cat > redirect.test.sh << 'zzz'
#!/bin/sh
var1="ysoftman"
echo "$var1"
zzz

# heredoc 은 2단계로 수행된다.
# 1. open file.txt
# 2. cat (> or >>) file.txt
# sudo 명령이 필요한 경우
# sudo cat > /etc/redirect.test.sh << 'zzz' ...
# 1. /etc/redirect.test.sh 파일은 현재 사용자 계정으로 오픈하고
# 2. 그 후에 sudo cat 명령을 실행하게 되어 permission denied 가 된다.
# 그래서 다음과 같이 bash -c 로 묶어 처리해야 한다.
sudo bash -c "cat > /etc/redirect.test.sh" << 'zzz'
#!/bin/sh
var1="ysoftman"
echo "$var1"
zzz

# heredoc 의 내용을 파이프(|)로 전달 할 수 도 있다.
cat << zzz | xargs echo "args->$*"
apple
lemon
banana
123
orange
zzz

# <<< $'' 을 사용하면 명령에 stdin 을 전달할 수 있다.
# 다음 pipe 이용 방법과 같다.
# echo -e 'bill\npassword123' | bash read_password_test.sh
bash read_password_test.sh <<< $'bill\npassword123'

zsh prezto 사용하기

# zsh 에 oh-my-zsh 와 더블어 많이 사용하는 prezto 를 사용해보자.
# zsh 을 실행하고 prezto 를 다운받기
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

# 다음 스크립트를 복붙하여 실행
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

# .zshrc 에 설정
vi ~/.zshrc
source ~/.zprezto/init.zsh

# zstyle 수정
vi ~/.zpreztorc
zstyle ':prezto:load' pmodule \
'environment' \
'terminal' \
'editor' \
'history' \
'directory' \
'spectrum' \
'utility' \
'completion' \
'prompt' \
'git' \
'syntax-highlighting' \
'history-substring-search' \

# iterm2 (night lion v2) +sh + prezto 사용화면


# 참고
https://github.com/sorin-ionescu/prezto
http://jeromedalbert.com/migrate-from-oh-my-zsh-to-prezto/
http://wikimatze.de/better-zsh-with-prezto

zsh oh-my-zsh 설정

# z쉘(zsh) 설치(맥 brew 기준)
brew install zsh

# oh-my-zsh 설치하여 zsh 설정을 쉽게 할 수 있다.
# 다음 명령으로 설치하면 .zshrc 설정이 변경하여 적용된다.
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

# 테마 변경 (참고 https://github.com/robbyrussell/oh-my-zsh/wiki/Themes)
# 기본 터미널(또는 iterm2) 의 색상 프로필에 따라 달라보인다.
# zsh(dallas) iterm2(materialdark) 로 선택
vi ~/.zshrc
ZSH_THEME="dallas"

# dallas 경우 기본적으로 timestamp  가 프롬프트에 포함된다.
# dallas 테마 파일에서 PROMPT 값에서 $DALLAS_CURRENT_TIME 를 제거해서 새로 만들자(기존은 주석처리)
vi ~/.oh-my-zsh/themes/dallas.zsh-theme
#PROMPT="$DALLAS_CURRENT_TIME_$DALLAS_CURRENT_RUBY_$DALLAS_CURRENT_MACH_$DALLAS_CURRENT_LOCA_ $DALLAS_CURRENT_USER_$DALLAS_PROMPT_CHAR_ "
PROMPT="$DALLAS_CURRENT_RUBY_$DALLAS_CURRENT_MACH_$DALLAS_CURRENT_LOCA_ $DALLAS_CURRENT_USER_$DALLAS_PROMPT_CHAR_ "

# ysoftman 계정의 기본 쉘을 zsh 로 변경하고 터미널 재시작~
# etc/shells 에  zsh 경로가 명시되어 있어야함
sudo chsh -s /usr/local/bin/zsh ysoftman

# 설정 후 z 쉘 화면