작업을 하다 보면 작은 코드 스니핏을 공유해야 하는 경우가 있다. 간단하게 텍스트 파일을 작성해서 메일이나 메신저를 통해서 공유할 수도 있고 GitHub의 gist 서비스를 이용해서 공유할 수 있다. 이 gist에 코드를 올리는 작업을 브라우저 없이 터미널에서도 가능하다. 서비스 이름과 동일하게 명령도 gist다.

OS X에서는 Homebrew로 바로 설치할 수 있으며 루비로 작성한 도구라서 gem으로도 설치 가능하다. apt-get에도 올라와 있는데 우분투에서 설치하고 나서 제대로 동작하지 않아 gem으로 설치했다.

$ brew install gist # OS X에서 homebrew를 사용하는 경우
$ gem install gist # gem이 설치되어 있는 경우

설치를 한 다음, gist 명령을 입력하면 프롬프트가 출력되서 바로 코드를 작성할 수 있다.

$ gist
(type a gist. <ctrl-c> to cancel, <ctrl-d> when done)
// 코드를 바로 입력. cat과 같이 동작함.
console.log("Hello World");
// <ctrl-d>를 입력해 저장.
# https://gist.github.com/bc7c51a5d5bef0465c67b38c39f29b7e
$

아직 로그인을 하지 않았기 때문에 입력한 내용이 익명 계정으로 등록된다. 로그인은 --login 플래그를 사용해서 할 수 있다.

$ gist --login
Obtaining OAuth2 access_token from github.
Github username: haruair
Github password:
Success! https://github.com/settings/applications
$

간단하게 이미 작성한 파일을 올리는 것도 가능하다.

$ gist hello.js
$ gist index.js index.jade style.css # 여러 파일을 올릴 때

파일명은 -f 또는 --filename으로 지정 가능하다. 파일명을 지정한 경우에는 STDIN으로 올리려는 파일을 지정할 수 있다. 그리고 업로드한 주소를 바로 사용할 수 있도록 복사하는 -c, --copy 플래그도 존재한다.

다음 명령에서는 hello.js 파일을 index.js로 gist에 업로드하고 그 주소를 바로 복사한다.

$ gist -c -f index.js < hello.js
# https://gist.github.com/69872a365b9b073eb94ac14e87eb469e

이외에도 기존에 올린 코드를 수정하거나 private 모드로 올리기, embed 코드를 반환하는 등 다양한 플래그가 있다. 이 도구에서 제공하는 모든 기능은 --help로 확인할 수 있다. ruby로 작성되어 있어서 만약 ruby로 개발한다면 코드에서 사용할 수 있는 라이브러리 형태로도 제공한다. 엔터프라이즈 사용자를 위한 설정도 존재하는데 상세한 내용은 defunkt/gist 문서에서 확인하자.

터미널에서 작업을 하다보면 메모리 사용량이나 스토리지 사용량을 확인하기 위해 free -m 또는 df -h를 사용해본 경험이 있을 것이다. 명령을 입력하고 엔터를 누르는 순간에 명령을 처리하고 그 결과를 반환하기 때문에 지속적으로 변하는 결과를 살펴보기엔 불편하게 느껴질지도 모른다. 그런 상황에서 사용할 수 있는 명령이 바로 watch다. 이 명령으로 간격을 두고 반복적으로 결과를 확인하고 싶은 명령을 손쉽게 사용할 수 있다.

대부분의 리눅스 환경에는 이미 설치되어 있을 것이다. OS X의 경우에는 homebrew로 설치할 수 있다.

$ brew install watch

간단하게 사용해보자. date를 입력하면 현재 시각을 확인할 수 있다. watch date를 입력하면 매 2초 간격으로 date의 결과를 화면에 표시한다.

$ date
Thu 14 Apr 2016 22:02:59 AEST
$ watch date
Every 2.0s: date        Thu Apr 14 22:03:26 2016
Thu 14 Apr 2016 22:03:26 AEST

화면에서 빠져나오기 위해서 Ctrl + C를 입력한다. 기본적으로 2초의 주기로 설정되어 있는데 2초가 조금 길다면 -n, --interval을 이용해서 그 주기를 조정할 수 있다. -d, --differences를 추가하면 어느 문자가 변하고 있는지 강조된다. 스토리지의 용량을 확인하는 df 명령과 함께 사용하면 다음과 같다.

$ watch -d -n 0.5 df -h
Every 0.5s: df -h           Thu Apr 14 22:03:26 2016
Filesystem      Size   Used  Avail Capacity   iused      ifree %iused  Mounted on
/dev/disk1     931Gi  643Gi  287Gi    70% 168658707   75329829   69%   /
devfs          186Ki  186Ki    0Bi   100%       644          0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%         0          0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%         0          0  100%   /home
/dev/disk2s1   1.8Ti  900Gi  963Gi    49%      2253 1009481363    0%   /Volumes/My Passport

만약 두 가지 이상의 명령을 동시에 모니터링하고 싶다면 간단하게 ;로 구분해서 호출할 수 있다. 다음은 현재 디렉토리를 확인하는 ls와 앞에서 본 df를 같이 사용하는 예시다.

$ watch -n 0.5 "ls -al ; df -h"
Every 0.5s: ls -al ; df -h          Thu Apr 14 22:03:26 2016
total 152
drwxr-xr-x@ 10 edward  staff    340 14 Apr 22:15 .
drwxr-xr-x@ 24 edward  staff    816 30 Mar 18:32 ..
-rw-r--r--@  1 edward  staff   2639 29 Mar 02:13 cowsay.md
-rw-r--r--@  1 edward  staff   2163  8 Apr 23:22 figlet.md
-rw-r--r--@  1 edward  staff   2541 14 Apr 21:43 gist.md
-rw-r--r--@  1 edward  staff    179  8 Apr 23:44 slurm.md
-rw-r--r--@  1 edward  staff  48201  8 Apr 23:26 slurm.png
-rw-r--r--@  1 edward  staff   1390  8 Apr 08:31 todo.md
-rw-r--r--@  1 edward  staff   2559 14 Apr 22:15 watch.md
-rw-r--r--@  1 edward  staff   2260  3 Apr 00:02 zsh-bash.md
Filesystem      Size   Used  Avail Capacity   iused      ifree %iused  Mounted on
/dev/disk1     931Gi  643Gi  287Gi    70% 168659745   75328791   69%   /
devfs          186Ki  186Ki    0Bi   100%       644          0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%         0          0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%         0          0  100%   /home
/dev/disk2s1   1.8Ti  900Gi  963Gi    49%      2253 1009481363    0%   /Volumes/My Passport

명령을 쌍따옴표로 감싸서 실행했다. ;는 명령행에서 특별한 의미를 갖는 문자이기 때문에 watch 내에서만 실행하도록 전달하기 위해 쌍따옴표를 사용했다. 따옴표 없이 사용하려 한다면 \;와 같이 역슬래시로 탈출문자 처리를 하면 쌍따옴표 없이 동일한 결과를 모니터링 할 수 있다.

이처럼 watch는 아주 간단한 용도로 사용할 수 있는 모니터링 도구다. 즉 메모리나 프로세스를 모니터링 할 때는 htop과 같이 각 필요에 따라서 더 정밀하고 자세한 정보를 제공하는 도구가 많으니 자주 사용한다면 꼭 관련 모니터링 도구를 살펴보자.

터미널을 사용하다보면 영문자를 아스키 아트로 출력해서 프로그램명이나 제작 크레딧을 멋지게 꾸민 경우를 종종 볼 수 있다. FIGlet은 영문자를 입력하면 아스키 아트로 출력해주는 간단한 도구다. 앞서 살펴본 cowsay도 있지만 이 도구는 문자를 직접 아스키 아트로 출력한다는 점이 다르다.

이 도구도 상당히 오래 전에 개발되었기에 어느 플랫폼이든 손쉽게 설치할 수 있다.

$ brew install figlet
$ apt-get install figlet

사용 방법도 간단하다. figlet 명령과 출력하려는 텍스트를 입력하면 된다.

$ figlet HelloWorld
 _   _      _ _    __        __         _     _ 
| | | | ___| | | __\ \      / /__  _ __| | __| |
| |_| |/ _ \ | |/ _ \ \ /\ / / _ \| '__| |/ _` |
|  _  |  __/ | | (_) \ V  V / (_) | |  | | (_| |
|_| |_|\___|_|_|\___/ \_/\_/ \___/|_|  |_|\__,_|

-f 플래그로 다른 폰트도 사용 가능하다. 다른 폰트는 FIGlet 사이트에서 폰트를 받아 추가할 수 있다.

$ figlet -f isometric1 jeju

       ___         ___            ___         ___     
      /\  \       /\  \          /\  \       /\__\    
      \:\  \     /::\  \         \:\  \     /:/  /    
  ___ /::\__\   /:/\:\  \    ___ /::\__\   /:/  /     
 /\  /:/\/__/  /::\~\:\  \  /\  /:/\/__/  /:/  /  ___ 
 \:\/:/  /    /:/\:\ \:\__\ \:\/:/  /    /:/__/  /\__\
  \::/  /     \:\~\:\ \/__/  \::/  /     \:\  \ /:/  /
   \/__/       \:\ \:\__\     \/__/       \:\  /:/  / 
                \:\ \/__/                  \:\/:/  /  
                 \:\__\                     \::/  /   
                  \/__/                      \/__/    

사실 이 도구는 cli 외에도 각 프로그래밍 언어마다 이미 구현이 있을 정도다.

이제 터미널로 접속할 때마다 뜨는 메시지, 밋밋한 콘솔의 서비스명을 더 힙하게 표시해보자!

REST API를 테스트하는데 curl과 wget을 사용할 수 있겠지만 좀 더 읽기 쉽고 사용하기 좋은 도구가 있다. HTTPie는 cURL-like tool for humans라는 멋진 태그라인을 갖고 있는 강력한 CLI 도구다. 따지고 보면 curl에서도 모두 가능한 기능이지만 플래그를 주렁주렁 입력할 필요가 없이 간편하게 사용할 수 있고 컬러 스킴이 있어 훨씬 읽기 편하다.

이 도구는 온갖 패키지 관리자에 다 들어있기 때문에 있는 패키지 관리자로 설치하면 된다. 파이썬으로 작성된 도구라서 pip로도 설치 가능하다.

# 하나만.. 다음 중 하나만 설치
$ brew install httpie
$ port install httpie
$ apt-get install httpie
$ yum install httpie
$ pip install httpie

사용 방법은 아주 단순하다.

$ http httpie.org

http [flags] [METHOD] URL [ITEM [ITEM]] 형태로 보낼 수 있다.

# HTTP 메소드와 해더, JSON 데이터 전송
$ http PUT example.org X-API-Token:123 name=John
# 폼 전송
$ http -f POST example.org hello=World
# request 출력
$ http -v example.org
<figure style="width: 722px" class="wp-caption alignnone">
cURL보다 간단하게 사용할 수 있다. 별 내용 아니지만 색깔 이쁘면 보기 좋지 않습니까.

이외에도 세션과 같은 다양한 기능을 제공한다. auth는 auth 플러그인으로 제공하고 있고 외부 json 파일이나 바이너리 파일을 전송하는 기능도 있다. curl만큼 방대한 기능을 제공하고 있으니 HTTPie 리포지터리를 확인해서 어떤 유용한 기능이 있는지 살펴보는 것도 좋겠다.

요즘은 REST API 테스트하는 도구가 워낙 잘 나와서 curl도 잘 안쓰게 되는 편이긴 하다. 그래도 간단한 테스트는 HTTPie로 더 쉽고 간단하게 수행할 수 있어서 요긴하게 사용하고 있어 만족스럽다.

터미널을 사용하다보면 사소하지만 유용한 스크립트를 작성할 때가 종종 있다. 스크립트로 작성한 코드로 결과를 그냥 출력할 수 있지만 다소 밋밋하게 느껴본 적은 없었는지 생각해보자. 빌드가 완료되거나 업스트림에 머지하는 스크립트가 Done.만 출력하면 실용적이긴 하지만 아쉬움이 있다. 그 부족함을 느꼈다면 cowsay를 사용해서 더 터미널 힙스터답게 메시지를 출력할 수 있다!

cowsay는 아스키아트와 함께 원하는 메시지를 출력할 수 있게 해주는 프로그램이다. 1999년부터 있던 프로그램이라서 터미널을 쓴다면 한번쯤은 어디선가 이미 봤을지도 모른다. perl로 작성되었다.

설치는 apt-get, homebrew 등 대부분의 패키지 관리자에서 제공한다.

$ apt-get install cowsay
$ brew install cowsay

사용 방법은 간단하다.

$ cowsay Hello World
 _____________
< Hello World >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

cowsay는 fortune이랑 자주 나온다. fortune은 포춘 쿠키에 들어있는 쪽지와 같은 내용을 출력하는 프로그램이다. fortune도 apt-get, brew 등으로 설치할 수 있다.

$ fortune | cowsay

-f 플래그를 사용하면 소 이외에도 다른 그림으로 사용할 수 있다. 사용할 수 있는 그림 목록은 -l 플래그로 확인할 수 있다.

$ fortune | cowsay -f sheep
 _________________________________________
/ This night methinks is but the daylight \
| sick.                                   |
|                                         |
| -- William Shakespeare, "The Merchant   |
\ of Venice"                              /
 -----------------------------------------
  \
   \
       __     
      UooU\.'@@@@@@`.
      \__/(@@@@@@@@@@)
           (@@@@@@@@)
           `YY~~~~YY'
            ||    ||

cow 파일을 COWDIR에 추가하면 자신이 직접 만든 메시지로도 사용할 수 있다. cowsay를 검색해보면 이 프로그램 이후에도 정말 다양한 언어로 작성되었다. 포니를 좋아한다면 ponysay도 살펴보자.

점점 각박하게 변해가는(?) GUI의 세계에서, 이 작은 메시지 출력까지도 아름답게 아스키아트로 표현하고야 마는 선현들의 낭만을 배워야 할 필요가 있다. 😀

조금은 생산적인 도구를 소개하는 것도 좋을 것 같아 GitHub 서비스를 위한 도구를 소개한다. GitHub API를 이용한 ghi가 꽤 많은데 API v3에 맞춰 현재까지 관리되고 있는 도구로 ghi가 있다. Github 리포지터리에 등록된 issue를 CLI에서 관리할 수 있도록 기능을 제공한다.

brew로 설치하거나 Ruby로 작성되어 있어서 gem으로도 설치 가능하다.

$ brew install ghi
$ gem install ghi

curl로도 설치할 수 있다.

$ curl -sL https://raw.githubusercontent.com/stephencelis/ghi/master/ghi > ghi && \
$ chmod 755 ghi && mv ghi /usr/local/bin

설치 후에 토큰을 발급 받기 위해서는 다음 명령이 필요하다.

$ ghi config --auth <GitHub 사용자ID>

맥에서는 키체인을 이용해서 토큰과 사용자 정보를 저장하는데 키체인의 문제인지 제대로 동작하지 않는다.1 그래서 내 경우는 수동으로 입력했는데 token을 위 방법으로 발급 받은 다음, GitHub access tokens 페이지에서 생성된 토큰을 Edit > Regenerate token 해서 다음과 같이 환경변수를 지정해줬다.

$ export GHI_TOKEN=<재생성한 access token>

이제 ghi를 입력하면 현재 배정된 이슈 목록이 출력되며 전체 목록은 필터 플래그를 이용해 ghi list -f 'all'로 확인할 수 있다. ghi helpghi help <명령어>로 도움말을 확인하자.

이제 웹브라우저 없이도 GitHub 이슈를 추적할 수 있다!

다른 도구도 많이 있는데 대부분 v2이 deprecated 된 이후로 업데이트 되지 않거나 전혀 관리되지 않고 있어서 아쉽다.

  • 리포지터리에 가도 관련 이슈가 넘쳐 나는데 해결책이 뚜렷하지 않다. 
  • bash나 zsh에서는 작업 제어(job control)을 기본적으로 제공하고 있다. 현재 동작하고 있는 프로그램을 백그라운드로 보내거나 백그라운드에 있는 프로그램을 다시 꺼내서 사용하는 것도 가능하다.

    평소에 다음과 같이, 끝에 &을 붙여 명령어를 사용해본 적이 있다면 자신도 모르는 사이에 이미 사용하고 있다는 뜻이다.

    $ npm start &
    [1] + running    npm start
    

    먼저 간단하게 예제를 보자. 다음 예시는 간단하게 sleep을 사용하고 있다. &와 함께 실행하면 백그라운드로 구동한다는 의미다.

    $ sleep 10 &
    [1] 3901
    $ sleep 20 &
    [2] 3902
    $ sleep 30 &
    [3] 3903
    

    현재 실행하고 있는 작업 목록은 jobs로 확인할 수 있다.

    $ jobs
    [1]   running    sleep 10
    [2] - running    sleep 20
    [3] + running    sleep 30
    

    현재 실행하고 있는 프로세스를 일시 정지하고 백그라운드로 보내는 키는 Ctrl + z다. (tmux를 사용하고 있다면 이 키로는 동작하지 않을 수 있다.)

    $ vim hello
    # <Ctrl + z>을 누름
    [1] + 4049 suspended   vim hello
    

    다시 해당 프로세스를 포그라운드로 부르기 위해서는 fg 명령을 사용할 수 있다. fg 뒤 인자는 직접 입력해도 되지만 tab 키를 누르면 알아서 자동완성 해준다.

    $ fg %1
    $ fg %vim\ hello
    

    만약 백그라운드에서 일시 정지가 아니라 계속 구동하려고 한다면 어떻게 해야 할까? 그때는 백그라운드 명령인 bg를 사용할 수 있다.

    $ sleep 30
    # <Ctrl + z>을 누름
    [1] + 4050 suspended  sleep 30
    $ bg %sleep
    # 아래처럼 간단하게 가능
    $ %sleep &
    [1] - 4050 continued  sleep 30
    $ jobs
    [1] - 4050 running    sleep 30
    $
    [1] - 4050 done       sleep 30
    

    알고 나니 별 내용은 아니지만 지금까지 전혀 모르고 사용했다는 점에 반성하는 마음에서, 그리고 매번 백그라운드를 끌 줄 몰라서 kill을 당해야만 했던 수많은 프로세스를 추모하며 작성했다. 지금까지 몰랐다는데 참 억울하지만 앞으로는 프로세스 번호 찾으려고 애쓸 일이 없다는 점이 참 감사하다.

    터미널에서 사용할 수 있는 트위터 클라이언트는 상당히 많은 편이다. 이전까지 node-tweet-cli를 사용하고 있었는데 스트림도 지원하고 간단하게 트윗을 하기엔 편했지만 멘션에 답하는 기능이 없어서 여간 불편했었다. 그러던 중에 rainbowstream을 보고 나서 한 눈에 반해 바로 옮겨타게 되었다.

    이 클라이언트는 현존하는 어떤 클라이언트보다 가장 힙스터스러운 트위터 환경을 구축해준다. 쇼케이스 보면 반하지 않을 수 없다.

    이 툴은 pip를 통해서 설치할 수 있다. 전역 설치를 하고 싶다면 그냥 설치하면 된다.

    # 그냥... 설치
    $ sudo pip install rainbowstream
    

    설치 가이드에서는 venv를 사용하길 권장하고 있다.

    # venv 설치
    $ virtualenv venv
    $ source venv/bin/activate
    $ pip install rainbowstream
    

    파이썬이 없거나 환경이 필요한 경우라면 리포지터리를 참고해서 설치하자.

    처음으로 실행하면 트위터의 토큰을 발행하기 위한 로그인 창이 뜬다. 토큰을 발행해서 숫자를 집어 넣으면 그때부터 사용 가능하다.

    트윗 작성은 t <내용>으로 할 수 있으며 h를 입력하면 도움말 전체를 확인할 수 있다. 가장 마음에 드는 부분은 아예 쉘처럼 동작한다는 점인데 실행하는 순간부터 스트림을 시작하고 매 스트림되는 메시지마다 id를 부여해서 rep <id> <내용> 식으로 멘션에 대한 응답도 쉽게 작성할 수 있다. 스트림은 p, r로 멈추고 다시 시작하는 것도 가능하다. 쉘 종료는 q로 가능하다.

    이렇게까지 트위터 해야하냐고 그만 물어보세요…

    심지어 테마도 지원하니 취향에 맞게 컬러 스킴도 지정해보자. theme으로 사용 가능한 테마 목록을 확인하고 theme <테마명>으로 변경할 수 있다.

    tmux와 함께 사용한다면 타임라인과의 분리불안을 해소하는 것과 동시에 본업(?)을 지속할 수 있는 환경을 구성할 수 있으니 tmux를 필히 사용하자.

    구글 검색을 위해서 파이어폭스를 켜며 문득, ‘그냥 터미널에서 구글 검색할 수 있는 방법은 없을까?’ 라는 생각이 들어서 검색해봤더니 역시 멋진 분이 googler라는 도구를 멋지게 만들어서 공유하고 있었다.

    googler는 파이썬으로 작성되어 있어서 파이썬이 기본적으로 필요하다. OS X나 Linux 환경 대부분은 기본적으로 설치되어 있는 버전과 함께 잘 구동된다.

    OS X 환경에서 Homebrew를 사용하고 있다면 brew로 쉽게 설치할 수 있다. 최근에 추가된 패키지라서 brew update가 필요할 수도 있다.

    $ brew install googler
    

    Linux 환경에서는 Homebrew Folk인 Linuxbrew를 사용해서 설치할 수 있다. 하지만 내 lubuntu 환경은 그렇게 공간이 넉넉한 편이 아니라서 git 리포지터리를 통해 바로 설치했다.

    $ git clone https://github.com/jarun/googler/
    $ cd googler
    $ sudo make install
    

    검색은 간단하다. googler <검색어>로 검색할 수 있는데 그 외 플래그 등 옵션은 googler를 입력하면 확인할 수 있다. 검색 결과에서 다음 검색 결과를 확인하는 것도 가능하며 열고 싶은 페이지의 숫자를 입력하면 웹브라우저로 열어준다.

    how to use googler

    구글 검색 결과를 아름답게 확인할 수 있다.

    이제 구글 검색도 힙하게 터미널에서 하자!

    요즘 타이핑을 하는데 손가락의 움직임이 점점 둔해지는 기분이 들어서 하루 5분이라도 짧게 연습하자는 목표를 만들었다. 터미널에서 간단하게 예제 문장을 보여주고 타이핑 하는 정도만 생각했는데 이미 GNU 프로젝트로 gtypist라는 타자연습 패키지가 존재했다.

    gtypist 화면

    화면에서 벌써 힙력이 느껴진다!

    “엄청 유명한데 나만 모르고 있었음” 패키지 같아서 따로 포스팅 안하려고 했는데 꾸준히 타자 연습하겠다는 목표를 적는 핑계와 함께 @justinchronicle님께 터미널이 힙하다는 얘기를 듣고 힙터지는 터미널 도구 연재를 해볼까 생각도 들어서 급 포스팅을 하고 있다.

    설치는 간단하다. 대부분의 패키지 관리자를 통해서 간단하게 설치 가능하다.

    $ brew install gtypist # in OS X
    $ apt-get install gtypist # in Ubuntu
    

    그리고 gtypist라고 입력하면 콘솔에서 타자연습 화면이 나온다. 한메타자교사 같이 화려한(지금 보면 뭐지 싶겠지만) 화면은 아니지만 그래도 타자 연습 예제를 제공하고 타수나 오타율을 확인할 수 있다.

    타이핑이 느려진다거나 코드 읽는 눈이 느려진다거나 하는 기분이 들면 실제로 그런지 안그런지는 사실 잘 모르겠지만 의식적으로 연습을 하지 않는다면 현행 유지 내지는 더 둔해지는 것은 당연한 것 같다. 내가 다른 일을 하고 있다면 몰라도 내 일에 가장 많은 시간을 할애하고 있는 기술인데 그냥 사소하게만 여겨서는 안될 것 같다. 사소한 부분도 의식하고 작은 시간이라도 투자해서 꾸준히 연습해야겠다.

    색상을 바꿔요

    눈에 편한 색상을 골라보세요 :)

    Darkreader 플러그인으로 선택한 색상이 제대로 표시되지 않을 수 있습니다.