Modern Unix — Part 1

[개요]

리눅스나 맥에서 개발하시는 개발자 여러분은 주로 터미널 화면에 머무는 시간이 많지 않을까 싶은데요. 저도 한 명의 터미널 덕후로서 여러분들이 좋아할 만한 소식을 들고 왔습니다. 최근 Rust 언어가 급부상하면서, 기존의 밋밋한 터미널 명령어들을 대체하려는 프로젝트들이 많이 생기고 있는데요. Rust는 메모리 안정성과 성능을 중시하는 언어이기 때문에, 기존의 C로 작성된 명령 줄 프로그램들을 대체하려는 움직임이 많습니다. Rust로 작성된 프로그램은 구동에 있어 별다른 성능 오버헤드가 없기 때문에 자주 사용되는 터미널 프로그램에 매우 적합한 언어입니다. 실제로 명령 줄 프로그램은 Rust가 활발하게 사용 범위를 넓히고 있는 영역이기도 합니다. 그럼 서론은 여기까지 하고, 터미널에서 많은 시간을 보내시는 개발자분들을 위해 몇 가지 도구들을 소개해 드리겠습니다.

[exa]

리눅스에서 가장 많이 사용하는 명령어가 무엇일까요? 아마도 ls가 아닐까 싶은데요. ls는 특정 디렉터리의 파일과 디렉터리 목록을 출력해 주며, 아무런 인자 없이 입력 시에는 현재 디렉터리의 내용을 출력합니다. 저도 리눅스에서 작업을 하게 되면 습관처럼 ls를 입력하는 경우가 굉장히 많습니다. 하지만 ls의 출력은 인간 친화적인 인터페이스는 아니죠. 이러한 불편한 점을 개선한 exa라는 프로그램이 있으며, 특징은 다음과 같습니다.

  • 색상 지원: 파일과 데이터의 종류에 따라 색상이 다르게 표시되며, 현재 사용자에 대해서는 사용자 및 그룹 열이 강조 표시됩니다.
  • 모든 정보: exa는 파일의 확장 속성은 물론, inode, 블록 수, 파일의 다양한 날짜 및 시간과 같은 표준 파일 시스템 정보도 표시할 수 있습니다.
  • 빠른 속도: exa는 파일을 병렬로 쿼리 하여 ls와 동등한 성능을 제공합니다.
  • 트리 뷰: 표준 트리 도구가 내장되어 있을 뿐만 아니라 계층 구조와 함께 파일 정보를 표시합니다.
  • GIT 지원: 모든 파일의 스테이징 상태와 스테이징 되지 않은 상태를 표준 보기에서 바로 확인할 수 있습니다. 트리 보기에서도 리포지토리에 대한 개략적인 개요를 볼 수 있습니다.

눈에 띄는 특징은 유저 강조 표시와 트리 뷰, git 지원 정도가 되겠네요. 요새 나오는 대부분의 터미널 프로그램은 git을 기본으로 지원하는 것 같습니다.

링크: https://github.com/ogham/exa

[bat]

cat 명령어를 아시나요? 파일의 내용을 표준 출력으로 출력하거나, 파일을 이어 붙일 때 쓰는 명령어죠. 기능은 굉장히 단순하지만, 쉘 스크립트 작성 시 많이 사용되는 명령어이기도 합니다. 이 cat을 대체하는 프로그램도 나왔습니다. 무려 구문 강조 기능이 추가되었는데요.

  • 구문 강조 표시: 수많은 프로그래밍 언어와 마크업 언어에 대한 구문 강조 표시를 지원합니다.
  • Git 통합: git과 통신하여 인덱스와 관련된 수정 사항을 표시합니다.
  • 인쇄할 수 없는 문자 표시: A/ — show-all 옵션을 사용하여 인쇄할 수 없는 문자를 표시하고 강조 표시할 수 있습니다.
  • 자동 pager: 기본적으로 bat는 출력이 한 화면에 비해 너무 크면 자체 출력을 pager(예: less)로 파이프 합니다.
  • 파일 합치기: pager가 설정되어 있어도 bat를 사용하여 파일을 연결할 수 있습니다. bat가 비대화형 터미널을 감지할 때마다(즉, 다른 프로세스나 파일로 파이프 할 때), — pager 옵션의 값에 관계없이 cat을 대체하여 일반 파일 내용을 인쇄하는 것으로 되돌아갑니다.

git과 통합되어 변경 사항이 있는 부분을 쉽게 알 수 있으며, non-printable 문자라고도 하는 공백 문자(스페이스, 탭) 혹은 제어 문자(CR, LF 등)를 표시해 주기도 합니다. 또한 고유의 cat 기능도 쓸 수 있는데, 파이프로 다른 프로세스와 연결되어 있으면 아무런 가공 없이 파일의 내용을 표준 출력으로 전달해 주기 때문에 이어 붙이기 기능도 사용할 수 있습니다.

링크: https://github.com/sharkdp/bat

[delta]

개인적으로는 터미널에서 확인하기 어려운 정보가 바로 코드의 변경 사항인데요. 특정 라인의 한 글자만 변경되어도 라인 전체가 표시됩니다. 로직 변경이면 그나마 나은데, 오타 수정 등의 변경 사항은 정말 눈에 띄지 않아, 말 그대로 눈알이 빠지도록 자세히 봐야 하죠. 하지만 이런 불편한 점들을 한 번에 해결해 줄 수 있는 도구가 있습니다. delta라는 도구이며, 주요 특징들은 아래와 같습니다.

  • bat과 동일한 구문 강조 테마를 사용한 언어 구문 강조 표시
  • 레벤 슈타인(Levenshtein) 편집 추론 알고리즘을 사용한 단어 수준 차이 강조 표시 (주: 라인 전체가 아닌 일부 부분 하이라이트)
  • side-by-side 뷰
  • side-by-side 뷰에서 긴 라인 자동 줄 바꿈
  • diff 간 이동( — navigate)을 위한 n 및 N 키 바인딩
  • merge-conflict 표시 개선
  • 개선된 git blame 표시(구문 강조 표시)
  • rg, git grep, grep 등의 grep 출력 구문 강조
  • diff에서 코드를 직접 복사 가능(-/+ 마커는 기본적으로 제거됨)
  • 스타일 문자열(전경 색, 배경색, 글꼴 속성)이 20개 이상의 스타일링 가능한 요소에 대해 지원되며, git과 동일한 색상/스타일 언어를 사용
  • git 출력 외에도 전통적인 diff 출력 처리

git에 통합하여 diff 툴로도 사용 가능하며, 전통적인 diff 도구로도 사용 가능하니, 관심 있으신 분은 설치해 보시기 바랍니다.

링크: https://github.com/dandavison/delta

[dust]

디스크 용량이 부족하여 파일 정리를 해야 할 때, du 명령어를 한 번씩 사용해 보셨죠? 하지만 du는 결과가 정렬이 되지 않아 많이 불편했는데요. 바로 이런 경우를 위해 사용하는 dust라는 대체 프로그램이 있습니다. dust라는 이름은 du + rust라고 하는데요. 디스크 사용률 순으로 주요 디렉터리 및 파일들만 보여줍니다. 이로써 디스크 정리가 더 쉬워지겠네요.

  • 기본적으로 가장 큰 디렉터리 먼저 표시가 됨
  • 권한이 없는 디렉터리에 대해 수행해도, ‘권한 없음’ 메시지는 최대 한 번만 출력됨
  • 터미널 높이를 고려하여, 가장 큰 하위 디렉터리 또는 파일 순으로 스마트하게 순회
  • -h ( — human-readable) 옵션이 기본값

링크: https://github.com/bootandy/dust

[duf]

주로 파티션의 남은 용량을 확인할 때 사용하는 df 명령어의 대체입니다. 남은 비율에 따라 색상을 바꿔서 표현해 주는 점이 인상 깊습니다. 또한 전체 사용량을 대략적으로 알 수 있는바 형태의 차트가 추가되어 df보다 결과를 확인하기 훨씬 편합니다. 오늘 소개해 드리는 도구 중에선 유일하게 Rust가 아닌 Go 언어로 작성되어 있습니다.

  • 사용자 친화적이고 colorful 한 출력
  • 터미널의 테마 및 너비에 맞게 조정 가능
  • 필요에 따라 결과 정렬
  • device 별로 그룹화 및 필터링
  • 결과를 JSON 포맷으로 출력 가능

링크: https://github.com/muesli/duf

[마치며]

짧게 끝낼 수 있을 줄 알았는데, 생각보다 포스트가 길어졌네요.

저도 개인 시간을 활용하여 펜타 제품에서 활용할 수 있는 분석 도구를 Rust로 틈틈이 개발하고 있는데요.

인터프리터 언어와 비할 바는 아니지만, 이전에 javascript로 만들었던 프로그램보다 확실히 속도가 빨라서 매우 만족하고 있습니다.

나날이 다르게 발전하고 있는 Rust의 생태계가 매우 기대되는 부분입니다.

이 밖에 더 유용하고 개선된 터미널 프로그램들은 다음 포스트를 통해 소개해 드리겠습니다!

--

--

펜타시큐리티 보안기술연구소
PentaSecurity Labs

펜타시큐리티 보안 기술 연구소 사람들의 생활과 기술 연구 및 각종 활동에 관한 이야기를 담은 블로그