Trong bài gần đây về setup Ubuntu với Bash script, tôi nhắc sơ đến phép màu của .bashrc. Điều đó không làm nó công bằng, nên đây là bài nhanh chi tiết hơn về những gì file cấu hình Bash có thể làm.
Cấu hình hiện tại của tôi cải thiện workflow lớn, và tiết kiệm hơn 50% keystroke so với không có nó! Hãy xem ví dụ aliases, functions, và cấu hình prompt cải thiện workflow bằng cách giúp chúng ta hiệu quả hơn với ít nhấn phím hơn.
Bash aliases
Một .bashrc viết thông minh tiết kiệm hàng loạt keystroke. Chúng ta tận dụng nghĩa đen bằng bash aliases, hoặc string mở rộng thành lệnh lớn. Ví dụ minh họa, đây là Bash alias copy file trong terminal:
# Luôn copy nội dung thư mục (r)ecursively và giải thích (v) gì đã làm
alias cp='cp -rv'
Lệnh alias định nghĩa string ta gõ, theo sau là string đó mở rộng thành. Chúng ta có thể override lệnh hiện có như cp trên. Bản thân cp chỉ copy file, không copy thư mục, và succeed im lặng. Với alias này, không cần nhớ pass hai cờ đó, cũng không cd hay ls vị trí file copy để confirm nó ở đó! Bây giờ, chỉ hai nhấn phím (cho c và d) làm tất cả cho chúng ta.
Dưới đây là thêm vài alias .bashrc pass flag với hàm phổ biến.
# Liệt kê nội dung với màu loại file, (A)lmost all hidden file (không . và ..), theo (C)ột, với class indicator (F)
alias ls='ls --color=auto -ACF'
# Liệt kê nội dung với màu loại file, (a)ll hidden entry (kể . và ..), dùng (l)ong listing format, với class indicator (F)
alias ll='ls --color=auto -alF'
# Giải thích (v) gì đã làm khi di chuyển file
alias mv='mv -v'
# Tạo thư mục cha không tồn tại (p) và giải thích (v) gì đã làm
alias mkdir='mkdir -pv'
# Luôn cố gắng (c)ontinue tải file tải một phần
alias wget='wget -c'
Aliases tiện khi muốn tránh gõ lệnh dài. Đây là vài alias tôi dùng khi làm việc với Python environment:
alias pym='python3 manage.py'
alias mkenv='python3 -m venv env'
alias startenv='source env/bin/activate && which python3'
alias stopenv='deactivate'
Để thêm cảm hứng cách Bash aliases tiết kiệm thời gian, tôi mạnh mẽ khuyến khích ví dụ trong bài này.
Bash functions
Nhược điểm alias trên là khá static - luôn mở rộng chính xác text khai báo. Cho Bash alias nhận argument, cần tạo function. Làm như sau:
# Hiển thị nội dung thư mục sau khi cd vào nó
function cd () {
builtin cd "$1"
ls -ACF
}
Tôi không đếm được bao nhiêu lần gõ cd rồi ls ngay sau xem nội dung thư mục mới. Với function này, tất cả xảy ra chỉ với hai chữ cái! Function lấy argument đầu $1 làm vị trí cd, sau đó in nội dung thư mục đó format đẹp cột với file type indicator. Phần builtin cần thiết để Bash cho phép override lệnh mặc định.
Bash functions rất hữu ích khi download hoặc upgrade software. Tôi trước đây mất ít nhất vài phút mỗi vài tuần tải phiên bản extended mới của static site generator Hugo, nhờ tần suất ship tuyệt vời của họ. Với function, chỉ cần pass version, upgrade xong trong vài giây.
# Hugo install hoặc upgrade
function gethugo () {
wget -q -P tmp/ https://github.com/gohugoio/hugo/releases/download/v"$@"/hugo_extended_"$@"_Linux-64bit.tar.gz
tar xf tmp/hugo_extended_"$@"_Linux-64bit.tar.gz -C tmp/
sudo mv -f tmp/hugo /usr/local/bin/
rm -rf tmp/
hugo version
}
Ký hiệu $@ đơn giản lấy tất cả argument, thay thế vị trí nó trong function. Để chạy function trên tải Hugo 0.57.2, dùng lệnh gethugo 0.57.2.
Tôi cũng có cho Golang:
function getgolang () {
sudo rm -rf /usr/local/go
wget -q -P tmp/ https://dl.google.com/go/go"$@".linux-amd64.tar.gz
sudo tar -C /usr/local -xzf tmp/go"$@".linux-amd64.tar.gz
rm -rf tmp/
go version
}
Hay function thêm remote origin URL GitLab cho repository hiện tại?
function glab () {
git remote set-url origin --add git@gitlab.com:"$@"/"${PWD##*/}".git
git remote -v
}
Với glab username, tạo origin URL mới cho Git repository hiện tại với username trên GitLab.com. Push đến remote URL mới tự tạo repository private GitLab mới, shortcut hữu ích tạo backup!
Bash functions thực sự chỉ bị giới hạn bởi khả năng scripting, mà thực tế ít giới hạn. Nếu có việc gì làm thường xuyên cần gõ vài dòng terminal, có thể tạo Bash function cho nó!
Bash prompt
Bên cạnh nội dung thư mục, cũng hữu ích thấy full path thư mục đang ở. Bash prompt cho thấy path này, cùng info hữu ích khác như Git branch hiện tại. Để dễ đọc hơn, định nghĩa màu cho từng phần prompt. Cách setup prompt trong .bashrc:
# Mã màu cồng kềnh, đặt tên cho dễ
txtcyn='\[\e[0;96m\]' # Cyan
txtpur='\[\e[0;35m\]' # Purple
txtwht='\[\e[0;37m\]' # White
txtrst='\[\e[0m\]' # Text Reset
# Màu (C)hoose cho phần nào của prompt?
pathC="${txtcyn}"
gitC="${txtpur}"
pointerC="${txtwht}"
normalC="${txtrst}"
# Lấy tên branch và bao ngoặc quanh nó
gitBranch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
# Xây dựng prompt
export PS1="${pathC}\w ${gitC}\$(gitBranch) ${pointerC}\$${normalC} "
Kết quả:
~/github/myrepo (master) $
Đặt tên màu giúp dễ xác định màu nào bắt đầu/kết thúc, màu nào tiếp theo. Prompt thấy trong terminal định nghĩa bởi string sau export PS1, mỗi component prompt set với escape sequence. Phân tích:
\whiển thị current working directory,\$(gitBranch)gọi functiongitBranchđịnh nghĩa trên, hiển thị Git branch hiện tại,\$hiển thị "$" nếu user bình thường hoặc normal user mode, và "#" nếu root.
Danh sách đầy đủ Bash escape sequence giúp hiển thị thêm info, kể cả time và date! Bash prompt tùy chỉnh cao và cá nhân, thoải mái setup như ý.
Dưới đây vài option đặt info front and center giúp làm việc hiệu quả hơn.
Cho người kiên trì
Username và thời gian hiện tại với giây, format 24h HH:MM:SS:
export PS1="${userC}\u ${normalC}at \t >"
user at 09:35:55 >
Cho người luôn muốn biết mình ở đâu
Full file path trên dòng riêng, và username:
export PS1="${pathC}\w${normalC}\n\u:"
~/github/myrepo
user:
Cho người tối giản
export PS1=">"
>
Chúng ta có thể xây dựng nhiều prompt thực tế chỉ với escape sequence cơ bản; khi bắt đầu tích hợp function với prompt, như ví dụ Git branch, chuyện có thể phức tạp. Mức phức tạp này là cộng hay trừ cho năng suất, chỉ bạn tự biết!
Nhiều fancy Bash prompt có thể với program sẵn có tìm nhanh. Tôi cố ý không đưa sample ở đây vì, nếu bạn hứng thú như tôi, có thể mất vài giờ trước khi quay lại việc đang làm trước khi đọc bài này, và tôi không muốn trên lương tâm. ?
Hy vọng chúng ta đạt cân bằng đẹp giữa time invested và usefulness từ file cấu hình Bash! Tôi hy vọng bạn dùng keystroke capacity mới recover cho điều tốt.