Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Các Alias Bash Cần Thiết Sẽ Tăng Năng Suất Của Bạn

Alias Bash là phương pháp bổ sung hoặc ghi đè lệnh Bash bằng lệnh mới. Alias Bash giúp người dùng dễ dàng tùy chỉnh trải nghiệm trong terminal POSIX. Chúng thường được định nghĩa trong $HOME/.bashrc hoặc $HOME/bash_aliases (phải được nạp bởi $HOME/.bashrc).

Hầu hết các bản phân phối thêm ít nhất một số alias phổ biến trong file .bashrc mặc định của tài khoản người dùng mới. Đây là các ví dụ đơn giản minh họa cú pháp alias Bash:

alias ls='ls -F'
alias ll='ls -lh'

Không phải bản phân phối nào cũng có sẵn alias điền sẵn. Nếu bạn thêm alias thủ công, bạn phải nạp chúng vào phiên Bash hiện tại:

$ source ~/.bashrc

Ngoài ra, bạn có thể đóng terminal và mở lại để nó tải lại file cấu hình.

Với các alias đó được định nghĩa trong script khởi tạo Bash, bạn có thể gõ ll và nhận kết quả của ls -l, và khi gõ ls bạn nhận được, thay vì đầu ra của ls thuần túy.

Những alias đó tuyệt vời, nhưng chúng chỉ xẻng mặt những gì có thể. Dưới đây là top 10 alias Bash mà, khi bạn thử, bạn sẽ không thể sống thiếu.

Thiết lập trước

Trước khi bắt đầu, tạo file ~/.bash_aliases:

$ touch ~/.bash_aliases

Sau đó, đảm bảo mã sau xuất hiện trong file ~/.bashrc:

if [ -e $HOME/.bash_aliases ]; then
source $HOME/.bash_aliases
fi

Nếu bạn muốn thử bất kỳ alias nào trong bài viết này, hãy nhập chúng vào file .bash_aliases, sau đó nạp vào phiên Bash bằng lệnh source ~/.bashrc.

Sắp xếp theo kích thước file

Nếu bạn bắt đầu đời làm việc với trình quản lý file GUI như Nautilus trong GNOME, Finder trong MacOS, hoặc Explorer trong Windows, bạn có lẽ đã quen sắp xếp danh sách file theo kích thước. Bạn có thể làm điều đó trong terminal, nhưng không hẳn gọn gàng.

Thêm alias này vào cấu hình trên hệ thống GNU:

alias lt='ls --human-readable --size -1 -S --classify'

Alias này thay thế lt bằng lệnh ls hiển thị kích thước mỗi mục, sau đó sắp xếp theo kích thước, trong một cột, với ký hiệu chỉ loại file. Nạp alias mới, và thử:

$ source ~/.bashrc
$ lt
total 344K
140K configure*
44K aclocal.m4
36K LICENSE
32K config.status*
24K Makefile
24K Makefile.in
12K config.log
8.0K README.md
4.0K info.slackermedia.Git-portal.json
4.0K git-portal.spec
4.0K flatpak.path.patch
4.0K Makefile.am*
4.0K configure.ac*
0 autom4te.cache/
0 share/
0 bin/
0 install-sh@
0 compile@
0 missing@
0 COPYING@

Trên MacOS hoặc BSD, lệnh ls không có cùng tùy chọn, nên alias này dùng thay thế:

alias lt='du -sh * | sort -h'

Kết quả phiên bản này hơi khác:

$ du -sh * | sort -h
0 compile
0 COPYING
0 install-sh
0 missing
4.0K configure.ac
4.0K dot-gitlab.ci.yml
4.0K flatpak.path.patch
4.0K git-portal.spec
4.0K info.slackermedia.Git-portal.json
4.0K Makefile.am
8.0K README.md
12K config.log
16K bin
24K Makefile
24K Makefile.in
32K config.status
36K LICENSE
44K aclocal.m4
60K share
140K configure
476K autom4te.cache

Thực tế, ngay cả trên Linux, lệnh đó cũng hữu ích, vì dùng ls liệt kê thư mục và symlink kích thước 0, có thể không phải thông tin bạn thực sự muốn. Tùy bạn chọn.

Cảm ơn Brad Alexander vì ý tưởng alias này.

Chỉ xem ổ đã mount

Lệnh mount từng rất đơn giản. Chỉ với một lệnh, bạn có được danh sách tất cả hệ thống file đã mount trên máy, và thường dùng để xem tổng quan ổ nào gắn vào trạm làm việc. Lúc trước thấy hơn ba bốn mục đã ấn tượng, vì hầu hết máy không có nhiều cổng USB hơn vậy, nên kết quả dễ quản lý.

Máy tính phức tạp hơn giờ, và giữa LVM, ổ vật lý, lưu trữ mạng, và hệ thống file ảo, kết quả mount khó phân tích:

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=8131024k,nr_inodes=2032756,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
[...]
/dev/nvme0n1p2 on /boot type ext4 (rw,relatime,seclabel)
/dev/nvme0n1p1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro)
[...]
gvfsd-fuse on /run/user/100977/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=100977,group_id=100977)
/dev/sda1 on /run/media/seth/pocket type ext4 (rw,nosuid,nodev,relatime,seclabel,uhelper=udisks2)
/dev/sdc1 on /run/media/seth/trip type ext4 (rw,nosuid,nodev,relatime,seclabel,uhelper=udisks2)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)

Để giải quyết vấn đề đó, hãy thử alias như sau:

alias mnt="mount | awk -F' ' '{ printf \"%s\t%s\n\",\$1,\$3; }' | column -t | egrep ^/dev/ | sort"

Alias này dùng awk phân tích đầu ra mount theo cột, rút gọn đầu ra xuống thứ bạn có thể đang tìm (ổ cứng nào, không phải hệ thống file, được mount):

$ mnt
/dev/mapper/fedora-root /
/dev/nvme0n1p1 /boot/efi
/dev/nvme0n1p2 /boot
/dev/sda1 /run/media/seth/pocket
/dev/sdc1 /run/media/seth/trip

Trên MacOS, lệnh mount không cung cấp đầu ra quá dài, nên alias có thể quá sức. Tuy nhiên, nếu bạn thích báo cáo gọn gàng, hãy thử:

alias mnt='mount | grep -E ^/dev | column -t'

Kết quả:

$ mnt
/dev/disk1s1 on / (apfs, local, journaled)
/dev/disk1s4 on /private/var/vm (apfs, local, noexec, journaled, noatime, nobrowse)

Tìm lệnh trong lịch sử grep

Đôi khi bạn tìm ra cách làm gì đó trong terminal, và hứa với mình rằng sẽ không bao giờ quên điều vừa học. Sau đó một giờ trôi qua, và bạn hoàn toàn quên mình đã làm gì.

Tìm kiếm trong lịch sử Bash là việc ai cũng phải làm lúc nào đó. Nếu bạn biết chính xác tìm gì, bạn có thể dùng Ctrl+R tìm kiếm ngược qua lịch sử, nhưng đôi khi bạn không nhớ chính xác lệnh cần tìm.

Đây là alias让那项任务容易一点:

alias gh='history|grep'

Ví dụ cách dùng:

$ gh bash
482 cat ~/.bashrc | grep _alias
498 emacs ~/.bashrc
530 emacs ~/.bash_aliases
531 source ~/.bashrc

Sắp xếp theo thời gian sửa đổi

Mỗi thứ Hai đều thế: Bạn đến làm, ngồi xuống máy, mở terminal, và phát hiện mình quên việc gì đang làm thứ Sáu trước. Cần một alias liệt kê file sửa đổi gần nhất.

Bạn có thể dùng lệnh ls tạo alias giúp tìm nơi bạn dừng lại:

alias left='ls -t -1'

Đầu ra đơn giản, tuy bạn có thể mở rộng với tùy chọn --long nếu thích. Alias như liệt kê hiển thị:

$ left
demo.jpeg
demo.xcf
design-proposal.md
rejects.txt
brainstorm.txt
query-letter.xml

Đếm file

Nếu bạn cần biết có bao nhiêu file trong thư mục, giải pháp là một trong những ví dụ kinh điển nhất về xây dựng lệnh UNIX: Bạn liệt kê file với ls, kiểm soát đầu ra chỉ một cột với tùy chọn -1, rồi pipe đầu ra đó đến lệnh wc (đếm từ) để đếm bao nhiêu dòng file đơn lẻ.

Đó là minh chứng tuyệt vời cho thấy triết lý UNIX cho phép người dùng tự xây dựng giải pháp dùng các thành phần hệ thống nhỏ. Tổ hợp lệnh này cũng khá nhiều gõ nếu bạn làm vài lần một ngày, và không chính xác cho thư mục chứa thư mục nếu không dùng tùy chọn -R, làm thêm dòng mới vào đầu ra và làm vô nghĩa bài tập.

Thay vào đó, alias này làm quá trình dễ dàng:

alias count='find . -type f | wc -l'

Alias này đếm file, bỏ qua thư mục, nhưng không phải nội dung thư mục. Nếu bạn có thư mục dự án chứa hai thư mục, mỗi thư mục chứa hai file, alias trả về bốn, vì toàn bộ dự án có bốn file.

$ ls
foo bar
$ count
4

Tạo môi trường ảo Python

Bạn code Python?

Bạn code Python nhiều?

Nếu có, bạn biết tạo môi trường ảo Python cần, tối thiểu, 53 lần nhấn phím.

Đó là 49 lần quá nhiều, nhưng dễ dàng khắc phục với hai alias mới gọi là ve và va:

alias ve='python3 -m venv ./venv'
alias va='source ./venv/bin/activate'

Chạy ve tạo thư mục mới, gọi là venv, chứa hệ thống file môi trường ảo thông thường cho Python3. Alias va kích hoạt môi trường trong shell hiện tại:

$ cd my-project
$ ve
$ va
(venv) $

Thêm thanh tiến trình khi copy

Mọi người đều chê progress bar vì chúng nổi tiếng không chính xác. Vàppure, sâu trong lòng, chúng ta đều似乎想要它们。UNIX cp 命令没有进度条,但它有 -v 选项用于详细输出,意味着它将每个正在复制的文件名回显到终端。这是一个相当不错的黑客手段,但当您复制一个大文件并希望了解还有多少文件尚未传输时,效果不佳。

pv 命令在复制期间提供进度条,但它不是默认应用程序。另一方面,rsync 命令包含在几乎所有可用 POSIX 系统的默认安装中,并被广泛认为是本地和远程复制文件最聪明的方法之一。

更好的是,它内置了进度条。

alias cpv='rsync -ah --info=progress2'

使用此别名与使用 cp 命令相同:

$ cpv bigfile.flac /run/media/seth/audio/
3.83M 6% 213.15MB/s 0:00:00 (xfr#4, to-chk=0/4)

使用此命令的一个有趣的副作用是,rsync 无需 cp 所需的 -r 标志即可复制文件和目录。

Bảo vệ khỏi xóa file nhầm

Bạn không nên dùng lệnh rm. Thậm chí trang manual rm cũng nói vậy:

Cảnh báo: Nếu bạn dùng 'rm' xóa file, thường có thể khôi phục nội dung file đó. Nếu bạn muốn chắc chắn hơn rằng nội dung thực sự không thể khôi phục, hãy cân nhắc dùng 'shred'.

Nếu bạn muốn xóa file, bạn nên di chuyển file vào Thùng rác, như khi dùng desktop.

POSIX làm cho việc này dễ dàng, vì Thùng rác là vị trí thực tế, có thể truy cập trong hệ thống file. Vị trí đó có thể thay đổi, tùy nền tảng: Trên FreeDesktop, Thùng rác ở ~/.local/share/Trash, còn MacOS là ~/.Trash, nhưngいずれにしても,它只是一个您将想要隐藏的文件放入其中的目录,直到您准备好永远擦除它们。

Alias đơn giản này cung cấp cách ném file vào Thùng rác từ terminal:

alias tcn='mv --force -t ~/.local/share/Trash '

Alias này dùng một cờ mv ít người biết cho phép bạn cung cấp file muốn di chuyển làm đối số cuối cùng, bỏ qua yêu cầu thường lệ là file đó phải liệt kê đầu tiên. Bây giờ bạn có thể dùng lệnh mới để di chuyển file và thư mục vào Thùng rác hệ thống:

$ ls 
foo bar
$ tcn foo
$ ls
bar

Bây giờ file "đi" rồi, nhưng chỉ đến khi bạn nhận ra trong mồ hôi lạnh rằng vẫn cần nó. Lúc đó, bạn có thể cứu file từ Thùng rác hệ thống; nhớ tip cho các nhà phát triển Bash và mv khi ra đi.

Lưu ý: Nếu bạn cần lệnh Trash mạnh mẽ hơn, tuân thủ FreeDesktop tốt hơn, xem Trashy.

Đơn giản hóa quy trình Git

Mọi người đều có quy trình làm việc riêng, nhưng thường có tác vụ lặp lại. Nếu bạn thường làm việc với Git, có thể có chuỗi thao tác bạn thấy mình lặp lại thường xuyên. Có thể bạn thấy mình quay lại nhánh master và kéo thay đổi mới lại hàng ngày, hoặc tạo tag rồi push lên remote, hoặc điều khác hoàn toàn.

Dù bạn chán gõ lệnh Git nào, bạn có thể giảm bớt đau khổ với alias Bash. Lớn nhờ khả năng truyền đối số cho hook, Git có bộ lệnh introspective phong phú giúp bạn tránh thực hiện các kỳ kỹ trong Bash.

Ví dụ, trong khi bạn có thể khó khăn xác định, trong Bash, thư mục cấp cao nhất của dự án (đối với Bash, đó là chỉ định tùy tiện hoàn toàn, vì cấp cao nhất tuyệt đối đối với máy tính là thư mục gốc), Git biết cấp cao nhất của nó bằng một truy vấn đơn giản. Nếu bạn nghiên cứu Git hook, bạn sẽ tìm ra được mọi loại thông tin mà Bash không biết, nhưng bạn có thể tận dụng thông tin đó với alias Bash.

Đây là alias tìm cấp cao nhất của dự án Git, bất kể bạn đang làm việc ở đâu trong dự án đó, rồi chuyển thư mục đến đó, chuyển sang nhánh master, và thực hiện git pull:

alias startgit='cd `git rev-parse --show-toplevel` && git checkout master && git pull'

Loại alias này không phải là alias hữu ích phổ biến, nhưng nó minh họa cách một alias đơn giản có thể loại bỏ nhiều điều hướng, lệnh, và chờ đợi prompt tẻ nhạt.

Một alias đơn giản hơn, và có lẽ phổ biến hơn, đưa bạn về cấp cao nhất của dự án Git. Alias này hữu ích vì khi bạn làm việc trên dự án, dự án đó ít nhiều trở thành thư mục "home" tạm thời. Việc đi "về nhà" nên đơn giản như đi về home thực, và đây là alias làm được điều đó:

alias cg='cd `git rev-parse --show-toplevel`'

Bây giờ lệnh cg đưa bạn đến đỉnh dự án Git, bất kể bạn đã đi sâu vào cấu trúc thư mục đến đâu.

Chuyển thư mục và xem nội dung cùng lúc

Có lần (nghe đồn) một nhà khoa học hàng đầu đề xuất chúng ta có thể giải quyết nhiều vấn đề năng lượng hành tinh bằng cách khai thác năng lượng tiêu tốn khi geek gõ cd theo sau ls.

Đó là mẫu phổ biến, vì thường khi bạn chuyển thư mục, bạn có động lực hoặc nhu cầu xem có gì xung quanh.

Nhưng "đi bộ" cây thư mục máy tính không phải là quá trình bắt đầu-dừng.

Đây là cheat, vì nó根本不是别名,但它是探索 Bash 函数的绝佳借口。虽然别名非常适合快速替换,但 Bash 允许您在 .bashrc 文件中添加本地函数(或单独的函数文件加载到 .bashrc,就像加载别名文件一样)。

为了保持模块化,创建一个名为 ~/.bash_functions 的新文件,然后让 .bashrc 加载它:

if [ -e $HOME/.bash_functions ]; then
source $HOME/.bash_functions
fi

在函数文件中,添加此代码:

function cl() {
DIR="$*";
# if no DIR given, go home
if [ $# -lt 1 ]; then
DIR=$HOME;
fi;
builtin cd "${DIR}" && \
# use your preferred ls command
ls -F --color=auto
}

将函数加载到 Bash 会话中,然后尝试:

$ source ~/.bash_functions
$ cl Documents
foo bar baz
$ pwd
/home/seth/Documents
$ cl ..
Desktop Documents Downloads
[...]
$ pwd
/home/seth

函数比别名灵活得多,但随着灵活性而来的是您必须确保代码讲得通并做您期望的事情的责任。别名旨在简单,所以保持它们简单但有用。对于对 Bash 行为的严重修改,请使用函数或保存到 PATH 中某个位置的自定义 shell 脚本。

记录在案,有一些聪明的黑客技巧可以将 cd 和 ls 序列实现为别名,所以如果您足够有耐心,即使使用卑微的别名,天空也是极限。

Bắt đầu alias và function

Tùy chỉnh môi trường là điều làm Linux thú vị, và tăng hiệu quả là điều làm Linux thay đổi cuộc sống. Bắt đầu với alias đơn giản, tiến lên function, và đăng alias bắt buộc của bạn trong bình luận!