Starship: 모든 셸에서 작고, 빠르고, 커스터마이즈 가능한 프롬프트
(starship.rs)- Starship은 다양한 셸 환경에서 사용할 수 있는 경량·고성능·유연성을 갖춘 프롬프트 오픈소스 프로젝트
- Bash, Zsh, Fish, Powershell, Tcsh 등 대부분의 주요 셸을 모두 지원하는 광범위한 호환성 제공
- 각 셸별로 초기화 스크립트를 간단히 추가하는 방식으로 설정 및 적용 가능
- Rust로 작성되어 빠른 속도와 안전성 을 보장하며, 단일 바이너리로 제공됨
- 모든 사소한 부분까지 커스터마이즈 가능
- 안드로이드, BSD, Linux, macOS, Windows 등 다양한 플랫폼에서 공통 환경 구성 지원, 생산성 향상 및 사용 편의성 제공
Starship 오픈소스 프로젝트
- Starship은 성능과 커스터마이즈를 동시에 지원하는 프롬프트 도구로, 다양한 운영체제와 셸에서 사용할 수 있음
- 기존의 무거운 프롬프트와 비교해 빠른 반응 속도와 낮은 리소스 사용량이 특징이며, 높은 커스터마이즈 가능성으로 개발 생산성 향상에 도움을 줌
각 셸 환경에서의 설정 방법
- Bash:
-
~/.bashrc
파일 끝에eval "$(starship init bash)"
코드 추가
-
- Fish:
-
~/.config/fish/config.fish
파일 끝에starship init fish | source
추가
-
- Zsh:
-
~/.zshrc
파일 끝에eval "$(starship init zsh)"
코드 추가
-
- Powershell:
-
Microsoft.PowerShell_profile.ps1
파일에Invoke-Expression (&starship init powershell)
추가 - PowerShell 프로필 파일 위치는
$PROFILE
변수로 확인 가능
-
- Ion:
-
~/.config/ion/initrc
파일에eval $(starship init ion)
코드 입력
-
- Elvish:
- v0.18 이상 버전만 지원
-
~/.elvish/rc.elv
파일에eval (starship init elvish)
코드 추가
- Tcsh:
-
~/.tcshrc
파일에eval \
starship init tcsh`` 코드 입력
-
- Nushell:
- v0.96 이상만 지원, 추후 설정 방식 변경 가능성 존재
- 설정 파일 경로는
$nu.config-path
명령으로 확인 - 해당 경로에
starship init nu | save -f ...
코드로 적용
- Xonsh:
-
~/.xonshrc
파일 끝에execx($(starship init xonsh))
코드 입력
-
- Cmd (Clink 필요):
- Clink v1.2.30 이상 필요
-
starship.lua
파일 생성 후 Clink 스크립트 디렉터리에 저장 - 내부에는
load(io.popen('starship init cmd'):read("*a"))()
코드 추가
Hacker News 의견
-
나는 맥시멀리스트 프롬프트를 좋아하는 유저이고 Starship을 통한 Shell Bling Ubuntu 설치를 개발 머신 구축에 자주 사용함
그렇지만 이런 스타일이 모두에게 맞는 것은 아님
가장 밀도 높은 정보만 추가하고 싶다면, 프롬프트가 나타난 시각과 마지막 명령 실행 지속 시간만 표시하는 추천
이 두 정보만 있으면 무엇이 언제 일어났는지 쉽게 파악할 수 있고, 추후 디버깅이나 기록 관리에 큰 장점
이런 방식은 Michael W. Lucas의 『Networking for System Administrators』에서 얻은 팁으로, 네트워크 기초를 배우려는 개발자들에게 이 책도 자주 추천
nerd 포인트를 더 받고 싶으면 UNIX epoch 기준 초 단위로 시간 표시
시간 델타 계산이 매우 쉬워지는 장점 있음
Shell Bling Ubuntu repo 참고-
nushell에서는 이런 정보가 기본적으로 제공됨
실행 기록(history)에서 명령어의 시작 타임스탬프, 실행 시간, 현재 디렉터리, 종료 상태 등 상세 정보 확인 가능
명령 실행 간의 시간 차이뿐 아니라 명령 자체의 실행 시간을 직접 보여주기 때문에 매우 편리함 -
프롬프트 커스터마이징을 한 적은 거의 없음
emacs를 사용하면 원하는 정보를 에디터에서 이미 다 볼 수 있기 때문
페어 프로그래밍처럼 남에게 보여야 할 때만 Starship을 셋업하고, 따로 별도의 터미널 앱을 열어둬서 내 세팅을 보여줄 필요가 없음 -
이전 명령어의 exit code(종료 코드)도 위와 비슷한 이유로 매우 유용한 정보
-
사람이 읽기 쉬운 형식으로 현재 시각을 보여주는 것도 꽤 도움이 됨
그리고 이전 명령의 종료 상태가 0이 아니라면(실패 시) 표시해주면 디버깅에 도움이 됨 -
나에게는 현재 디렉터리 정보 하나만으로 충분
마지막 커맨드의 성공/실패 상태에 따라 프롬프트 색만 바꿔주면 됨
추가 정보는 필요할 때 별도로 확인하면 됨
-
-
Starship 사용자의 나이 분포 데이터가 궁금해진다는 호기심
본인은 시간이 지나면서 프롬프트 커스터마이징에 큰 관심이 없어짐
아무리 프롬프트를 정교하게 꾸며도 보여지는 90%의 정보는 90%의 시간 동안 불필요한 정보라는 결론
오히려 너무 많은 정보가 시각적 노이즈로 느껴져 결국 뇌가 무시하게 되어 그 정보가 있다는 사실조차 잊게 됨
정말 중요한 정보는 프롬프트로는 한계가 있고, 예를 들어 변경된 Git 브랜치가 있다는 표시만으로는 어떤 파일이 바뀌었는지 알 수 없어서 결국 추가 명령 실행이 필요함-
20년 넘게 개발 경력 보유
프롬프트에 Git 정보가 있는 걸 매우 유용하게 사용 중
세세한 정보까지 알 수 있는 건 아니지만, 커밋하지 않은 변경이나 잊어버린 stash 등이 있다는 걸 상기시켜줘서 좋음
Starship은 흥미로워서 바로 설치해봤지만, 도구 버전 표시 같은 부분은 너무 시끄럽게 느껴지고 결국 언인스톨
커맨드 타이밍이나 성공/실패 상태 같은 옵션은 좋았지만, 복잡한 커스텀 구성을 관리하는 수고에 비해 남는 게 적었음 -
업계 25년 이상의 시니어 입장에서 화려한 최신 툴은 잘 안 쓰는 편
예전에는 <pre><code>export PS1="[\033[1;32m][\t \u@\h \w]\$[\033[0m]"</code></pre>처럼 시간, 내 계정, 접속 호스트, 현재 경로 정도만 표시하는 매우 단순한 PS1 사용
다른 고도화된 프롬프트도 여러 번 시도했으나 거의 도움이 안 됨
현재는 Starship을 몇 년째 잘 쓰는 중
필요한 정보만 최소하게 나오게 커스텀해서 매우 빠르고 쾌적하게 사용 -
내 프롬프트 커스텀의 가장 유용한 부분 중 하나는 직전 커맨드의 exit status(종료 코드) 표시
아무런 에러 메시지 없이 명령 실행이 실패하는 경우가 있어서 실패 표시가 있는 게 큰 시그널
단, 평소에는 노이즈가 되지 않도록 실패했을 때만 표시
예: <pre><code>» true » false (last command returned 1.)</code></pre>
신호(signal)로 종료된 경우도 번역해서 표시 "last command exited on SIGSEGV" 같이
반대로 프로그램이 에러 메시지를 내보냈음에도 성공 코드로 종료하는 경우에도 유용 -
수십 년 UNIX 사용 경험의 "very senior" 유저로서 Starship minimal mode가 깔끔해서 선호
과거엔 수년간 여러 zsh 세팅으로 고생했지만, 지금은 hassle이 거의 없음
만약 Starship 유저들이 다 자바스크립트에서 emoji 남발하는 신세대일 거라 예상했다면 나같은 사람도 있음을 밝힘 -
더 넓게 보면 전체 컴퓨팅 환경에 적용되는 현상
어릴 때는 Gentoo로 직접 OS 만들고, CPU 최적화 플래그, 창 관리자, bashrc alias와 함수, 프롬프트까지 집착해서 세팅하는 것에 몰두
이런 최적화 작업 자체가 성장 과정에서 꽤 도움이 되는 경험
목공에 비유하자면, 초보 때는 툴이나 잔재주를 만들고 다듬는 데 대부분의 시간을 보내지만, 어느 순간 실전 작업 위주로 집중 전환
지금도 리눅스를 좋아하지만, 바쁜 현실에서 효율과 완성도를 따지기보단 “일”을 우선시하기 때문에 그냥 Debian과 KDE로 기본 환경 사용
-
-
불필요한 장식이나 정보의 과잉을 싫어해서 미니멀한 터미널 환경 선호
하지만 Starship은 필요에 따라 맥락을 잘 보여주고, 세밀하게 커스텀 가능
기본 프롬프트는 현재 디렉터리, 시각, 그리고 % 하나만 표시
특정 환경 변수(KUBECONFIG, OS_CLOUD 등)가 설정되면 적절히 해당 정보도 포함
Go, Python 등 언어 버전도 사용 맥락에 따라 자동 표시
Starship은 이런 세팅을 정말 손쉽게 가능하게 해주고, 복잡한 zsh 플러그인 구성 없이 최소한의 오버헤드로 그대로 동작
특히 evalcache와 함께 사용하면 초기화 속도도 아주 빠름 -
Starship 팬으로서 몇 가지 코멘트
Rust로 안전하고 빠르게 개발된 점과 빌드된 바이너리라 퍼포먼스가 파이썬 기반 powerline, 쉘 스크립트 기반 ohmybash, zshell 기반 ohmyzsh, spaceship보다 훨씬 좋음
zsh, bash, sh, fish 지원은 당연하고, MS Windows CMD, Powershell까지 지원
단일 config 파일로 모든 시스템 프롬프트를 관리할 수 있는 것은 거의 유일
정보가 너무 많으면 간단히 바꿀 수 있고, 아이콘도 비활성화 가능
약 100개의 모듈로 커스터마이징의 한계가 거의 없음 -
Starship을 “minimal”하다고 마케팅하는 이유를 이해하지 못함
<pre><code>: ▶</code></pre>
실제로는 매우 다양한 기능이 많고, 실제 사용하는 것도 보면 거대한 프롬프트에 온갖 장식이 붙어 있음
나는 다음처럼 아주 간단하게 사용진짜 미니멀을 원한다면 이런 커스터마이징 프레임워크가 꼭 필요하지 않음
-
다른 쉘과 프롬프트에 비해 Starship의 구성 파일은 복잡도가 올라가도 꽤 직관적이라는 장점이 있음
-
모든 기능을 비활성화할 수 있음
<pre><code>format = """ $username\ $hostname\ $shlvl\ $directory\ $git_branch\ $git_commit\ $git_state\ $git_metrics\ $git_status\ $package\ $python\ $rust\ $env_var\ $custom\ $cmd_duration\ $jobs\ $time\ $status\ $shell\ $character"""</code></pre>
나는 지금 이런 느낌의 미니멀 구성을 사용 중 -
Starship은 결국 미니멀하게 쓰는 것도 가능하지만, 본질적으로는 최대한 많은 정보와 내용을 담을 수 있는 맥시멀리스트 프롬프트
이 점을 인정하면 좋을 것 같음 -
나는 이보다 더 얇은 화살표 사용
<pre><code>PROMPT='%{%F{red}%}%~ %{%F{yellow}%}% › %{%F{reset_color}%}%'</code></pre>깨끗하고, 심플하면서, 미니멀 구현
-
-
커스터마이즈 가능함과 맥시멀리즘을 혼동하는 반응들이 놀라움
기본값은 좀 과하지만, 원하는 만큼 줄일 수 있음
나는 여러 AWS 환경, 다양한 런타임에서 일하는데 프롬프트의 컨텍스트 정보가 실제로 큰 도움이 됨
개인적으로는 언제나 Starship + Nushell 조합을 오랫동안 써오고 있음 -
한 번만 설치하면 더 이상 손댈 필요 없어 좋아함
나는 쉘이 node 20인지 22인지, rust가 stable인지 nightly인지 같은 정보가 바로 보이길 원하는데
이런 것들을 추가 작업 없이 바로 보여주니까 만족 -
Starship과 무관하게 zsh 프롬프트에서 Enter를 누를 때 커서가 순간적으로 줄 맨 앞쪽에 움직이며 “플래시”가 일어나는 현상이 불편
ultra-fast 프롬프트일 때는 덜하지만, 프롬프트에서 뭔가 조금이라도 동작하면 이 현상이 매우 잘 보임
여러 터미널(gnome-terminal, wezterm, kitty, alacritty, xterm)에서 동일하게 관찰됨
유일하게 urxvt 터미널에서는 이 문제가 발생하지 않음
영상 재현 참고
이런 플래시 현상의 원인 및 회피법이 궁금 -
git status 등 쓸모없는 정보를 100ms마다 프롬프트가 렌더링할 때마다 확인하게 되면, 보이지 않는 생산성 저하로 이어짐
터미널은 반응형 메모리 도구여야 하고, 불필요한 장식이 되는 것은 피해야 함
코드 실행 속도엔 신경쓰면서 내 타이핑 지연(latency)에 관해선 관대해지는 것이 문제-
Starship은 정말 빠름
필요한 데이터 수집에 단 몇 ms밖에 안 걸리고, 어떤 정보를 추출할지 쉽게 제어 가능
그동안 써본 다른 툴에서는 길게 느껴지는 지연 때문에 항상 불편했지만, Starship 사용할 때는 체감 차이가 확연함 -
사람이 느끼는 100ms와 CPU 최적화의 100ms는 완전히 다름
내 생각에, 프롬프트가 git 브랜치나 상태 표시하는 데 100ms 걸린다고 해서 “흐름(flow)”이 깨지는 것과, 내가 직접 명령을 입력하는 데 더 오래 걸리는 것 중 뭘 더 최적화해야 하는지 생각하게 됨
적정한 편의 기능에 소요되는 수 ms는 충분히 감수할 만한 가치
결국엔 편의와 미니멀리즘, 둘 사이에서 균형점 찾기
극단적인 미니멀리즘이나 과한 장식 모두 비효율로 이어질 수 있음 -
이런 지연이 거슬려서, kitty 터미널을 패치해 Starship 프롬프트를 vim이나 emacs처럼 하단 status bar(모델라인)에 옮겨 사용
모델라인은 비동기적으로 업데이트되어 프롬프트 반응이 매우 빠름
downside는 kitty를 직접 패치해야 하고, 내 개인 리눅스 환경 외에 테스트하지 못함
관련 패치 프로젝트 참고 -
프롬프트 도구가 TUI처럼 프롬프트 출력을 완전히 반환한 이후에도 프롬프트 영역을 비동기적으로 수정하는 방식(예: kubectl, git, aws cli가 나중에 200ms 지나고 정보 추가 표시)이 가능할지 궁금
이렇게 하면 사용자는 대기 없이 바로 다음 명령을 칠 수 있고, 부가 정보는 나중에 자연스럽게 표시 가능 -
코드 실행 최적화보다 오히려 사용하는 계층(layer)이 많아지면서 실제로는 프롬프트의 입력 지연 최적화가 더 어려워지는 상황이 아닐까 생각
-
-
공식 웹사이트에 갔을 때 왜 Starship을 써야 하는지에 대한 명확한 설명이 부족하다고 느낌
<pre><code>- 마지막 명령 결과(색상: 초록, 빨강, 보라)
최근 내 프롬프트 커스텀은 아래의 정보를 한눈에 보여줌
- user@host:currentDirectory
- (repo 내면) 현재 브랜치 및 git status 요약, 백그라운드 잡</code></pre>
마지막 명령이 성공하면 초록, 실패하면 빨강, 중단된 경우는 보라로 표시
내가 그들의 타깃 유저일 수 있는데, 홈페이지에서는 "왜" 써야 하는지, 어떤 개선점이 있는지를 명확히 전달받지 못함