멍청한 개발자의 일대기

bash_profile 뜯어보기 - 1부 본문

Linux

bash_profile 뜯어보기 - 1부

멍청한 개발자 2020. 2. 27. 11:30
이 글은 Mac ( Unix 체제 )을 기준으로 작성되었습니다.
+ 수정중( 2020.02.26 기준 )

안녕하세요.

이번 주제는 터미널과 밀접하게 관련된 친구입니다. 최대한 쉽게 설명해보려고 노력은 해보겠지만 bash_profile에서 쓰는 명령어 자체가 가독성이 떨어지기 때문에 천천히 잘 따라와 주시면 감사하겠습니다.

-들어가기에 앞서 제 개인적인 생각을 조금 더하자면 요즘 CLI(Command Line Interface)의 중요성?이 떨어지고 있다고 느낍니다. 사내를 포함해서요.

... 뭐 예를 들어 GIt을 터미널을 이용해서 사용하기보다는 IDESouretree 같은 GUI를 이용하지 터미널을 이용하지는 않는다는 말입니다. 아무래도 CLI의 사용성이 자연스럽게 줄어들었다고 볼 수 있겠죠. 당연한 결과라고 생각합니다. GUI를 사용하면 별다른 학습이 필요 없고 Git 자체의 기능에만 충실하면 되니까요. 

물론 GUI를 쓰면 안 된다는 것도 아니고 CLI만을 사용해야 된다 라는 의견도 아닙니다. 아마 모르고 사용해도 개발업무에는 지장이 없고 다른 우회 방법으로 터미널을 최대한 사용하지 않고 할 수 있다고 생각은 합니다. 다만-

-개인적인 견해는 터미널을 활용하지 못한다는 건 개발적으로 큰 손해라고 생각됩니다.

아니.. 그-

물론 자기의 분야에 따라 그 중요도는 달라질 수 있겠지만 IDE에서 동작하는 Git내부에서는 Git-CLI를 통해서 동작하고 있다면, 그 원리를 파악하고 있어야 진정한 툴러라 할 수 있지 않겠습니까?

모르고 쓰는 것보다는 알고 쓰는 것이 어떠한 문제에 봉착했을 때 또 다른 시점으로 문제를 바라보게 해 줄 수 있을 거라 생각합니다.

또한 GUI 보다는 CLI를 이용하여 카페에서 작업하는 것이 여자 친구를 얻을 확률도 올라갑니다. ( SSR 등급 0.01% 확률 )

그런 눈으로 바라보시면 안됩니다.

서론이 조금 길었습니다만- 아마 이 글을 읽고 계신 분이라면 bash_profile을 포함하여 보다 터미널을 심도 있게 사용하고 싶으신 분이라고 생각돼서 한번 말해보았습니다. 자 그럼 이제 시작해봅시다.

사실 bash_profile이 어디까지 가능한지는 저도 아직 배워야 할 점이 많지만 지금까지 제가  bash_profile을 다뤄오면서 좋았던 점, 그리고 어떻게 하면 터미널을 더욱 편하게 쓸 수 있을까? 그러한 부분에 대해서 팁?을 공유하려고 합니다.

물론 제것이 답은 아니니 어느 정도 자기에게 필요한 기능만 가져가서 쓰시면 되겠습니다.

일단 제가 사용하고 있는 bash_profile을 뜯어보는 게 빠르겠죠? 아래가 현재 저의 bash_profile입니다. 제 실제 업무와 관련된 부분은 조금 수정했지만 아마 문제는 없을 거라고 생각됩니다.

#  ---------------------------------------------------------------------------
#
#  Description:  This is bash_profile
#
#  Sections:
#  1.   Environment Configuration
#  2.   Make Terminal Better (remapping defaults and adding functionality)
#  3.   File and Folder Management
#  4.   Searching
#  5.   Process Management
#  6.   Networking
#  7.   System Operations & Information
#  8.   Web Development
#  9.   Reminders & Notes
#
#  ---------------------------------------------------------------------------
#   -------------------------------
#   1.  ENVIRONMENT CONFIGURATION
#   -------------------------------
#   BASH
#   ------------------------------------------------------------
	export BASH_SILENCE_DEPRECATION_WARNING=1

#   Set Paths
#   ------------------------------------------------------------
    export PATH="$PATH:/usr/local/bin/"
    export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$PATH"

#   NVM
#   ------------------------------------------------------------
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

#   RUST
#   ------------------------------------------------------------
    export PATH="$HOME/.cargo/bin:$PATH"

#   Flutter
#   ------------------------------------------------------------
    export PATH="$PATH:/usr/local/bin/flutter/bin"

#   Set Default Terminal Editor (change 'Vim' to the editor of your choice)
#   ------------------------------------------------------------
    export EDITOR=/usr/bin/vim
    
#   Change Prompt
#   ------------------------------------------------------------
# get current branch in git repo
function parse_git_branch() {
	BRANCH=`git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
	if [ ! "${BRANCH}" == "" ]
	then
		STAT=`parse_git_dirty`
		echo "[${BRANCH}${STAT}]"
	else
		echo ""
	fi
}
# get current status of git repo
function parse_git_dirty {
	status=`git status 2>&1 | tee`
	dirty=`echo -n "${status}" 2> /dev/null | grep "modified:" &> /dev/null; echo "$?"`
	untracked=`echo -n "${status}" 2> /dev/null | grep "Untracked files" &> /dev/null; echo "$?"`
	ahead=`echo -n "${status}" 2> /dev/null | grep "Your branch is ahead of" &> /dev/null; echo "$?"`
	newfile=`echo -n "${status}" 2> /dev/null | grep "new file:" &> /dev/null; echo "$?"`
	renamed=`echo -n "${status}" 2> /dev/null | grep "renamed:" &> /dev/null; echo "$?"`
	deleted=`echo -n "${status}" 2> /dev/null | grep "deleted:" &> /dev/null; echo "$?"`
	bits=''
	if [ "${renamed}" == "0" ]; then
		bits=">${bits}"
	fi
	if [ "${ahead}" == "0" ]; then
		bits="*${bits}"
	fi
	if [ "${newfile}" == "0" ]; then
		bits="+${bits}"
	fi
	if [ "${untracked}" == "0" ]; then
		bits="?${bits}"
	fi
	if [ "${deleted}" == "0" ]; then
		bits="x${bits}"
	fi
	if [ "${dirty}" == "0" ]; then
		bits="!${bits}"
	fi
	if [ ! "${bits}" == "" ]; then
		echo " ${bits}"
	else
		echo ""
	fi
}
	export PS1="\[\e[32m\]\u\[\e[m\]\[\e[32m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\]\[\e[37m\]:\[\e[m\]\[\e[34m\]\w\[\e[m\]\[\e[37m\]\\[\e[m\]\[\e[33m\] \`parse_git_branch\`\[\e[m\]$ "

#   Set default blocksize for ls, df, du
#   from this: http://hints.macworld.com/comment.php?mode=view&cid=24491
#   ------------------------------------------------------------
    export BLOCKSIZE=1k
#   Add color to terminal
#   (this is all commented out as I use Mac Terminal Profiles)
#   from http://osxdaily.com/2012/02/21/add-color-to-the-terminal-in-mac-os-x/
#   ------------------------------------------------------------
#   export CLICOLOR=1
#   export LSCOLORS=ExFxBxDxCxegedabagacad
source "`brew --prefix grc`/etc/grc.bashrc"

#   -----------------------------
#   2.  MAKE TERMINAL BETTER
#   -----------------------------
#   SSH
#   --------------------------------------------------------------
alias ssh_aws='ssh -i "/Users/stupid/.ssh/aws.pem" ubuntu@amazonaws.com'
alias sshfs_aws='sshfs ubuntu@amazonaws.com:/home/ubuntu ~/Workspace/aws -o IdentityFile=/Users/stupid/.ssh/aws.pem'
alias sshfs_aws_disconnect='umount ~/Workspace/aws'

#   Tools
#   --------------------------------------------------------------
alias python=python3
alias ls='ls -Gp'			    # Preferred ‘ls’ implementation
alias cp='cp -iv'                           # Preferred 'cp' implementation
alias mv='mv -iv'                           # Preferred 'mv' implementation
alias mkdir='mkdir -pv'                     # Preferred 'mkdir' implementation
alias ll='ls -FGlAhp'                       # Preferred 'ls' implementation
# alias less='less -FSRXc'                    # Preferred 'less' implementation
cd() { builtin cd "$@"; ll; }               # Always list directory contents upon 'cd'
alias cd..='cd ../'                         # Go back 1 directory level (for fast typers)
alias ..='cd ../'                           # Go back 1 directory level
alias ...='cd ../../'                       # Go back 2 directory levels
alias .3='cd ../../../'                     # Go back 3 directory levels
alias .4='cd ../../../../'                  # Go back 4 directory levels
alias .5='cd ../../../../../'               # Go back 5 directory levels
alias .6='cd ../../../../../../'            # Go back 6 directory levels
# alias edit='subl'                           # edit:         Opens any file in sublime editor
alias f='open -a Finder ./'                 # f:            Opens current directory in MacOS Finder
alias ~="cd ~"                              # ~:            Go Home
alias c='clear'                             # c:            Clear terminal display
# alias which='type -all'                     # which:        Find executables
alias path='echo -e ${PATH//:/\\n}'         # path:         Echo all executable Paths
alias show_options='shopt'                  # Show_options: display bash options settings
alias fix_stty='stty sane'                  # fix_stty:     Restore terminal settings when screwed up
alias cic='set completion-ignore-case On'   # cic:          Make tab-completion case-insensitive
mcd () { mkdir -p "$1" && cd "$1"; }        # mcd:          Makes new Dir and jumps inside
trash () { command mv "$@" ~/.Trash ; }     # trash:        Moves a file to the MacOS trash
ql () { qlmanage -p "$*" >& /dev/null; }    # ql:           Opens any file in MacOS Quicklook Preview
alias DT='tee ~/Desktop/terminalOut.txt'    # DT:           Pipe content to file on MacOS Desktop
#   lr:  Full Recursive Directory Listing
#   ------------------------------------------
alias lr='ls -R | grep ":$" | sed -e '\''s/:$//'\'' -e '\''s/[^-][^\/]*\//--/g'\'' -e '\''s/^/   /'\'' -e '\''s/-/|/'\'' | less'
#   mans:   Search manpage given in agument '1' for term given in argument '2' (case insensitive)
#           displays paginated result with colored search terms and two lines surrounding each hit.             Example: mans mplayer codec
#   --------------------------------------------------------------------
    mans () {
        man $1 | grep -iC2 --color=always $2 | less
    }
#   showa: to remind yourself of an alias (given some part of it)
#   ------------------------------------------------------------
    showa () { /usr/bin/grep --color=always -i -a1 $@ ~/Library/init/bash/aliases.bash | grep -v '^\s*$' | less -FSRXc ; }

#   -------------------------------
#   3.  FILE AND FOLDER MANAGEMENT
#   -------------------------------
zipf () { zip -r "$1".zip "$1" ; }          # zipf:         To create a ZIP archive of a folder
alias numFiles='echo $(ls -1 | wc -l)'      # numFiles:     Count of non-hidden files in current dir
alias make1mb='mkfile 1m ./1MB.dat'         # make1mb:      Creates a file of 1mb size (all zeros)
alias make5mb='mkfile 5m ./5MB.dat'         # make5mb:      Creates a file of 5mb size (all zeros)
alias make10mb='mkfile 10m ./10MB.dat'      # make10mb:     Creates a file of 10mb size (all zeros)
#   cdf:  'Cd's to frontmost window of MacOS Finder
#   ------------------------------------------------------
    cdf () {
        currFolderPath=$( /usr/bin/osascript <<"    EOT"
            tell application "Finder"
                try
            set currFolder to (folder of the front window as alias)
                on error
            set currFolder to (path to desktop folder as alias)
                end try
                POSIX path of currFolder
            end tell
        EOT
        )
        echo "cd to \"$currFolderPath\""
        cd "$currFolderPath"
    }
#   extract:  Extract most know archives with one command
#   ---------------------------------------------------------
    extract () {
        if [ -f $1 ] ; then
          case $1 in
            *.tar.bz2)   tar xjf $1     ;;
            *.tar.gz)    tar xzf $1     ;;
            *.bz2)       bunzip2 $1     ;;
            *.rar)       unrar e $1     ;;
            *.gz)        gunzip $1      ;;
            *.tar)       tar xf $1      ;;
            *.tbz2)      tar xjf $1     ;;
            *.tgz)       tar xzf $1     ;;
            *.zip)       unzip $1       ;;
            *.Z)         uncompress $1  ;;
            *.7z)        7z x $1        ;;
            *)     echo "'$1' cannot be extracted via extract()" ;;
             esac
         else
             echo "'$1' is not a valid file"
         fi
    }

#   ---------------------------
#   4.  SEARCHING
#   ---------------------------
alias qfind="find . -name "                 # qfind:    Quickly search for file
ff () { /usr/bin/find . -name "$@" ; }      # ff:       Find file under the current directory
ffs () { /usr/bin/find . -name "$@"'*' ; }  # ffs:      Find file whose name starts with a given string
ffe () { /usr/bin/find . -name '*'"$@" ; }  # ffe:      Find file whose name ends with a given string
#   spotlight: Search for a file using MacOS Spotlight's metadata
#   -----------------------------------------------------------
    spotlight () { mdfind "kMDItemDisplayName == '$@'wc"; }

#   ---------------------------
#   5.  PROCESS MANAGEMENT
#   ---------------------------
#   findPid: find out the pid of a specified process
#   -----------------------------------------------------
#       Note that the command name can be specified via a regex
#       E.g. findPid '/d$/' finds pids of all processes with names ending in 'd'
#       Without the 'sudo' it will only find processes of the current user
#   -----------------------------------------------------
    findPid () { lsof -t -c "$@" ; }
#   memHogsTop, memHogsPs:  Find memory hogs
#   -----------------------------------------------------
    alias memHogsTop='top -l 1 -o rsize | head -20'
    alias memHogsPs='ps wwaxm -o pid,stat,vsize,rss,time,command | head -10'
#   cpuHogs:  Find CPU hogs
#   -----------------------------------------------------
    alias cpu_hogs='ps wwaxr -o pid,stat,%cpu,time,command | head -10'
#   topForever:  Continual 'top' listing (every 10 seconds)
#   -----------------------------------------------------
    alias topForever='top -l 9999999 -s 10 -o cpu'
#   ttop:  Recommended 'top' invocation to minimize resources
#   ------------------------------------------------------------
#       Taken from this macosxhints article
#       http://www.macosxhints.com/article.php?story=20060816123853639
#   ------------------------------------------------------------
    alias ttop="top -R -F -s 10 -o rsize"
#   my_ps: List processes owned by my user:
#   ------------------------------------------------------------
    my_ps() { ps $@ -u $USER -o pid,%cpu,%mem,start,time,bsdtime,command ; }

#   ---------------------------
#   6.  NETWORKING
#   ---------------------------
alias myip='curl ip.appspot.com'                    # myip:         Public facing IP Address
alias netCons='lsof -i'                             # netCons:      Show all open TCP/IP sockets
alias flushDNS='dscacheutil -flushcache'            # flushDNS:     Flush out the DNS Cache
alias lsock='sudo /usr/sbin/lsof -i -P'             # lsock:        Display open sockets
alias lsockU='sudo /usr/sbin/lsof -nP | grep UDP'   # lsockU:       Display only open UDP sockets
alias lsockT='sudo /usr/sbin/lsof -nP | grep TCP'   # lsockT:       Display only open TCP sockets
alias ipInfo0='ipconfig getpacket en0'              # ipInfo0:      Get info on connections for en0
alias ipInfo1='ipconfig getpacket en1'              # ipInfo1:      Get info on connections for en1
alias openPorts='sudo lsof -i | grep LISTEN'        # openPorts:    All listening connections
alias showBlocked='sudo ipfw list'                  # showBlocked:  All ipfw rules inc/ blocked IPs
#   ii:  display useful host related informaton
#   -------------------------------------------------------------------
    ii() {
        echo -e "\nYou are logged on ${RED}$HOST"
        echo -e "\nAdditionnal information:$NC " ; uname -a
        echo -e "\n${RED}Users logged on:$NC " ; w -h
        echo -e "\n${RED}Current date :$NC " ; date
        echo -e "\n${RED}Machine stats :$NC " ; uptime
        echo -e "\n${RED}Current network location :$NC " ; scselect
        echo -e "\n${RED}Public facing IP Address :$NC " ;myip
        #echo -e "\n${RED}DNS Configuration:$NC " ; scutil --dns
        echo
    }

#   ---------------------------------------
#   7.  SYSTEMS OPERATIONS & INFORMATION
#   ---------------------------------------
alias mountReadWrite='/sbin/mount -uw /'    # mountReadWrite:   For use when booted into single-user
#   cleanupDS:  Recursively delete .DS_Store files
#   -------------------------------------------------------------------
    alias cleanupDS="find . -type f -name '*.DS_Store' -ls -delete"
#   finderShowHidden:   Show hidden files in Finder
#   finderHideHidden:   Hide hidden files in Finder
#   -------------------------------------------------------------------
    alias finderShowHidden='defaults write com.apple.finder ShowAllFiles TRUE'
    alias finderHideHidden='defaults write com.apple.finder ShowAllFiles FALSE'
#   cleanupLS:  Clean up LaunchServices to remove duplicates in the "Open With" menu
#   -----------------------------------------------------------------------------------
    alias cleanupLS="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user && killall Finder"
#    screensaverDesktop: Run a screensaver on the Desktop
#   -----------------------------------------------------------------------------------
    alias screensaverDesktop='/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background'

#   ---------------------------------------
#   8.  WEB DEVELOPMENT
#   ---------------------------------------
# alias apacheEdit='sudo vim /etc/httpd/httpd.conf'      # apacheEdit:       Edit httpd.conf
# alias apacheRestart='sudo apachectl graceful'           # apacheRestart:    Restart Apache
alias editHosts='sudo vim /etc/hosts'                  # editHosts:        Edit /etc/hosts file
alias herr='tail /var/log/httpd/error_log'              # herr:             Tails HTTP error logs
# alias apacheLogs="less +F /var/log/apache2/error_log"   # Apachelogs:   Shows apache error logs
httpHeaders () { /usr/bin/curl -I -L $@ ; }             # httpHeaders:      Grabs headers from web page
#   httpDebug:  Download a web page and show info on what took time
#   -------------------------------------------------------------------
    httpDebug () { /usr/bin/curl $@ -o /dev/null -w "dns: %{time_namelookup} connect: %{time_connect} pretransfer: %{time_pretransfer} starttransfer: %{time_starttransfer} total: %{time_total}\n" ; }
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Development
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3
# source /usr/local/bin/virtualenvwrapper.sh
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

그냥 파일 하나 던져주고 알려주기에는 생각보다 조금 길어서 섹션별로 블록을 나누어 설명하겠습니다. 아마 Python을 해보신 분들은 바로 알아채셨겠지만 '#'는 한 줄 주석입니다. '#'으로 시작되는 줄은 가독성의 편의를 위해 코멘트나 구분선을 넣었다고 보시면 됩니다.

#  ---------------------------------------------------------------------------
#
#  Description:  This is bash_profile
#
#  Sections:
#  1.   Environment Configuration
#  2.   Make Terminal Better (remapping defaults and adding functionality)
#  3.   File and Folder Management
#  4.   Searching
#  5.   Process Management
#  6.   Networking
#  7.   System Operations & Information
#  8.   Web Development
#  9.   Reminders & Notes
#
#  ---------------------------------------------------------------------------

먼저 헤더를 살펴보면 이 파일이 어떤 섹션으로 나누어져 있고 각 섹션의 타이틀이 적혀있습니다.  아래 블록들 또한 한 녀석을 제외하고는 섹션 단위로 나뉘어 있습니다. 단순 코멘트이므로 빠르게 'Environment Configuration'으로 넘어가시죠.

#   -------------------------------
#   1.  ENVIRONMENT CONFIGURATION
#   -------------------------------
#   BASH
#   ------------------------------------------------------------
    export BASH_SILENCE_DEPRECATION_WARNING=1

#   PATH
#   ------------------------------------------------------------
    export PATH="$PATH:/usr/local/bin/"
    export PATH="$PATH:/usr/bin:/bin:/usr/sbin:/sbin"

#   NVM
#   ------------------------------------------------------------
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

#   RUST
#   ------------------------------------------------------------
    export PATH="$HOME/.cargo/bin:$PATH"

#   Flutter
#   ------------------------------------------------------------
    export PATH="$PATH:/usr/local/bin/flutter/bin"

#   Set Default Terminal Editor (change 'Vim' to the editor of your choice)
#   ------------------------------------------------------------
    export EDITOR=/usr/bin/vim
    

이 섹션은 환경 변수에 관한 설정들입니다. 제 블로그 첫 글인 Flutter 연대기에서도 사용되었던 것을 보실 수 있으실 텐데요.

BASH에 저 설정은 Catalina 업데이트되면서 zsh 쓰라는 Warning 없애기 위해서 추가한 거고 여기서 처음으로 만나는 명령어가 있는데-

export

 

export 친구가 환경 변수를 설정하기 위한 명령어인데 만약 "export TEST='a' "라고 한다면 "TEST라는 환경변수에 'a'를 넣는다"라고 컴퓨터에게 말하는 것과 같습니다. 

var TEST = 'a' 같은 거예요. 별로 어렵지 않습니다.

이제 여기서 특별한 부분은 OS 또는 System에서 사용하는 환경변수특정 프로그램에서 사용하는 환경 변수로 갈립니다. 아래 NVM 같은 경우가 특정 프로그램에서 사용하는 경우가 된다고 볼 수 있고 이런 친구들을 우리는 사용자 환경 변수라고 부르는 듯합니다.

그리고 이제 PATHHOME 같은 환경 변수들이 시스템에서 사용하는 시스템 환경 변수죠.

시스템이 사용하니- 시스템 환경 변수.. 뭐 당연한 거

여기서 의문점 하나, 입력해야 되는 PATH가 여러 개면 어떻게 해야 할까? 뭐 바로 말하자면 ':' 사이에 두면 컴퓨터가 "아 이놈과 이놈으로 구분되는구나" 하고 알아먹습니다. 근데 자세히 보면 맨 앞에 다른 녀석이 껴 잇습니다.

'$PATH' 이 친구는 뭐하는 녀석일까요.

뭐 특별한 친구는 아니고 앞에 있는 '$' 이게 하나의 명령어인데 선언한 환경 변수참조하는 친구입니다.

프로그래밍 언어로 보면 아래와 같은 겁니다. 기호 좀 몇 개 써서 복잡해 보이는 거예요

export PATH="test"
export PATH="$PATH:/usr/local/bin/"
export PATH="$PATH:/usr/bin:/bin:/usr/sbin:/sbin"

...

PATH = "test"
PATH = PATH + "/usr/local/bin/" 
PATH = PATH + "usr/bin" + "/bin" + "/usr/sbin" + "/sbin"

그럼 이제 딱히 특별해 보이는 친구는 별로 없습니다. 간단히 변수에 경로를 넣는 것처럼 보여요.

딱 한 놈만 빼고요.

#   NVM
#   ------------------------------------------------------------
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

이 친구는 사실 NVM 설치하신 분들도 그냥 넣으라서 모르고 있으신 분들도 많다고 생각되는데 사실 위와 같은 명령어는 참조에 다시 참조를 했을 뿐 그렇게 어렵지는 않습니다.

HOME 폴더 안에 있는. nvm폴더 안에 있는 nvm.sh를 실행해라 인데요. "~/. nvm/nvm.sh"를 보면 말 그대로 NVM을 불러오는 스크립트입니다.

부팅 시 bash_profile을 통해서 NVM을 자동으로 불러오는 형태인 거죠. 

터미널에 "[ -s ~/. nvm/nvm.sh ] &&.~/. nvm/nvm.sh"라고 입력한 거랑 같은 명령어라고 보면 되는 거죠. 

사실 이 Change Prompt 친구는 제일 중요한 녀석이라고 생각합니다. 터미널의 이쁨을 담당해요. 간단한 스샷으로 있고 없음을 보여드리도록 하자면,

적용 후

 

적용 전

이 정도의 차이가 있습니다. 사실 제가 몇개 안건드려서 그렇지 작정하고 커스텀하면 파일 확장자 별로 색깔을 지정 할 수도 있고, 특정 명령어를 통해 Git의 상태를 보다 깔끔하게 볼 수도 있습니다. 사용하기 나름인거죠. 이제 아래에서 이 친구가 어떻게 변했는지 하나 하나 뜯어보도록 합시다.

#   Change Prompt
#   ------------------------------------------------------------
# get current branch in git repo
function parse_git_branch() {
	BRANCH=`git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
	if [ ! "${BRANCH}" == "" ]
	then
		STAT=`parse_git_dirty`
		echo "[${BRANCH}${STAT}]"
	else
		echo ""
	fi
}
# get current status of git repo
function parse_git_dirty {
	status=`git status 2>&1 | tee`
	dirty=`echo -n "${status}" 2> /dev/null | grep "modified:" &> /dev/null; echo "$?"`
	untracked=`echo -n "${status}" 2> /dev/null | grep "Untracked files" &> /dev/null; echo "$?"`
	ahead=`echo -n "${status}" 2> /dev/null | grep "Your branch is ahead of" &> /dev/null; echo "$?"`
	newfile=`echo -n "${status}" 2> /dev/null | grep "new file:" &> /dev/null; echo "$?"`
	renamed=`echo -n "${status}" 2> /dev/null | grep "renamed:" &> /dev/null; echo "$?"`
	deleted=`echo -n "${status}" 2> /dev/null | grep "deleted:" &> /dev/null; echo "$?"`
	bits=''
	if [ "${renamed}" == "0" ]; then
		bits=">${bits}"
	fi
	if [ "${ahead}" == "0" ]; then
		bits="*${bits}"
	fi
	if [ "${newfile}" == "0" ]; then
		bits="+${bits}"
	fi
	if [ "${untracked}" == "0" ]; then
		bits="?${bits}"
	fi
	if [ "${deleted}" == "0" ]; then
		bits="x${bits}"
	fi
	if [ "${dirty}" == "0" ]; then
		bits="!${bits}"
	fi
	if [ ! "${bits}" == "" ]; then
		echo " ${bits}"
	else
		echo ""
	fi
}
	export PS1="\[\e[32m\]\u\[\e[m\]\[\e[32m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\]\[\e[37m\]:\[\e[m\]\[\e[34m\]\w\[\e[m\]\[\e[37m\]\\[\e[m\]\[\e[33m\] \`parse_git_branch\`\[\e[m\]$ "

#   Set default blocksize for ls, df, du
#   from this: http://hints.macworld.com/comment.php?mode=view&cid=24491
#   ------------------------------------------------------------
    export BLOCKSIZE=1k
#   Add color to terminal
#   (this is all commented out as I use Mac Terminal Profiles)
#   from http://osxdaily.com/2012/02/21/add-color-to-the-terminal-in-mac-os-x/
#   ------------------------------------------------------------
#   export CLICOLOR=1
#   export LSCOLORS=ExFxBxDxCxegedabagacad
source "`brew --prefix grc`/etc/grc.bashrc"

프롬 내용 추가

이제 다음 섹션인 보다 터미널을 좋게을 한번 가볍게 봅시다. ㅇㅋ

#   -----------------------------
#   2.  MAKE TERMINAL BETTER
#   -----------------------------
#   SSH
#   --------------------------------------------------------------
alias ssh_aws='ssh -i "/Users/stupid/.ssh/aws.pem" ubuntu@amazonaws.com'
alias sshfs_aws='sshfs ubuntu@amazonaws.com:/home/ubuntu ~/Workspace/aws -o IdentityFile=/Users/stupid/.ssh/aws.pem'
alias sshfs_aws_disconnect='umount ~/Workspace/aws'

#   Tools
#   --------------------------------------------------------------
alias python=python3
alias ls='ls -Gp'			    # Preferred ‘ls’ implementation
alias cp='cp -iv'                           # Preferred 'cp' implementation
alias mv='mv -iv'                           # Preferred 'mv' implementation
alias mkdir='mkdir -pv'                     # Preferred 'mkdir' implementation
alias ll='ls -FGlAhp'                       # Preferred 'ls' implementation
# alias less='less -FSRXc'                    # Preferred 'less' implementation
cd() { builtin cd "$@"; ll; }               # Always list directory contents upon 'cd'
alias cd..='cd ../'                         # Go back 1 directory level (for fast typers)
alias ..='cd ../'                           # Go back 1 directory level
alias ...='cd ../../'                       # Go back 2 directory levels
alias .3='cd ../../../'                     # Go back 3 directory levels
alias .4='cd ../../../../'                  # Go back 4 directory levels
alias .5='cd ../../../../../'               # Go back 5 directory levels
alias .6='cd ../../../../../../'            # Go back 6 directory levels
# alias edit='subl'                           # edit:         Opens any file in sublime editor
alias f='open -a Finder ./'                 # f:            Opens current directory in MacOS Finder
alias ~="cd ~"                              # ~:            Go Home
alias c='clear'                             # c:            Clear terminal display
# alias which='type -all'                     # which:        Find executables
alias path='echo -e ${PATH//:/\\n}'         # path:         Echo all executable Paths
alias show_options='shopt'                  # Show_options: display bash options settings
alias fix_stty='stty sane'                  # fix_stty:     Restore terminal settings when screwed up
alias cic='set completion-ignore-case On'   # cic:          Make tab-completion case-insensitive
mcd () { mkdir -p "$1" && cd "$1"; }        # mcd:          Makes new Dir and jumps inside
trash () { command mv "$@" ~/.Trash ; }     # trash:        Moves a file to the MacOS trash
ql () { qlmanage -p "$*" >& /dev/null; }    # ql:           Opens any file in MacOS Quicklook Preview
alias DT='tee ~/Desktop/terminalOut.txt'    # DT:           Pipe content to file on MacOS Desktop
#   lr:  Full Recursive Directory Listing
#   ------------------------------------------
alias lr='ls -R | grep ":$" | sed -e '\''s/:$//'\'' -e '\''s/[^-][^\/]*\//--/g'\'' -e '\''s/^/   /'\'' -e '\''s/-/|/'\'' | less'
#   mans:   Search manpage given in agument '1' for term given in argument '2' (case insensitive)
#           displays paginated result with colored search terms and two lines surrounding each hit.             Example: mans mplayer codec
#   --------------------------------------------------------------------
    mans () {
        man $1 | grep -iC2 --color=always $2 | less
    }
#   showa: to remind yourself of an alias (given some part of it)
#   ------------------------------------------------------------
    showa () { /usr/bin/grep --color=always -i -a1 $@ ~/Library/init/bash/aliases.bash | grep -v '^\s*$' | less -FSRXc ; }

새로운 친구들이 많이 보이는데 그중에서 제일 많이 보이는 친구 먼저 알아보자면-

alias

제가 제일 좋아하는 명령어인데 보시면 알다싶히 원래 있던 커맨드를 줄여주거나, 또는 길게 입력해야되는 커맨드를 하나의 명칭으로 간단히 만들어 줍니다. 특정 폴더에 스크립트를 추가하고 저 명령어를 이용해 어디서든 스크립트를 실행 시킬수도 있습니다. 

이중에서 제가 제일 자주 사용하는걸로 예를 들면-

alias ssh_aws='ssh -i "/Users/stupid/.ssh/aws.pem" ubuntu@amazonaws.com'

이 명령어 인데 외부나 AWS같은 서버에 접속할때 저 명령어를 ssh_aws를 타이핑하는걸로 바로 접속할 수 있게 해줍니다.

alias는 간단하게 ssh_aws를 입력하면 컴퓨터가 받아들일때는 'ssh - i~~~ .com'으로 받아들이는거에요. alias뜻 처럼 별명인겁니다.

제 이름이 만약 바리안 얼라이언스 위안이라도 바리안이라 부르면 알아듣는거랑 비슷합니다. 간단하지만 있으면 좋은 기능이죠. 

1부는 이렇게 섹션 2까지만 진행하고 나머지는 2부에서 만납시다. 1부에서 쓴 명령어를 대부분 반복하게 될거라 나머지는 빠르게 진행될 것같습니다. 읽어주셔서 감사하고

다음 2 부에서 만납시다.

Comments