: trong shell là lệnh rỗng (null command) chỉ đánh giá đối số rồi bỏ qua, và khi kết hợp với mở rộng tham số có thể xử lý ngắn gọn việc kiểm tra đối số bắt buộc và thiết lập giá trị mặc định
: "${1:?missing argument, aborting!}" sẽ in thông báo chẩn đoán ra stderr và thoát với trạng thái khác 0 nếu $1 không có hoặc rỗng
- Khi truyền
${VAR:=default} làm đối số cho :, phần mở rộng vẫn được thực thi nhưng chuỗi kết quả bị bỏ đi, vì vậy có thể chỉ thiết lập giá trị mặc định mà không thực thi kết quả mở rộng như một lệnh
- Có thể dùng
: để làm rỗng tệp và kiểm tra khả năng truy cập bằng chuyển hướng, làm lệnh rỗng cho trap, kiểm tra biến trong môi trường set -u, và cả trong các nhánh điều kiện để trống
: "${VAR:=default}" chỉ cần viết tên biến một lần nên giảm khả năng gõ nhầm, và trong while: nó trở thành điều kiện luôn thành công để biểu đạt vòng lặp vô hạn
Lệnh rỗng và mở rộng tham số
: là lệnh nội bộ lệnh rỗng: đánh giá các đối số rồi bỏ kết quả đi
- Nó có lịch sử ngược về tận Thompson shell năm 1971, khi đó còn được dùng như nhãn và là ký hiệu chú thích đầu tiên của Unix
- Thay vì một câu lệnh điều kiện bốn dòng, có thể kiểm tra đối số bắt buộc chỉ bằng một dòng sau
: "${1:?missing argument, aborting!}"
echo "Hello $1!"
- Cú pháp mở rộng tham số
${name:?diagnostic} sẽ kiểm tra xem $name có chưa được thiết lập hoặc đang rỗng hay không
- Nếu không có giá trị, nó sẽ in
diagnostic ra stderr và thoát shell với trạng thái khác 0
- Nếu có giá trị, nó cho ra kết quả giống như
$name
- Nếu chạy
${HELLO:=123} mà không có lệnh rỗng, kết quả mở rộng 123 sẽ bị coi là một lệnh và gây ra lỗi command not found
: ${HELLO:=123} sẽ đánh giá phần mở rộng để thiết lập HELLO=123, đồng thời bỏ đi kết quả đó
: "${DATA_DIR:=/var/data}" khác với DATA_DIR="${DATA_DIR:-/var/data}" ở chỗ chỉ cần viết tên biến một lần, nên giảm khả năng gõ nhầm như DATA_DRI
Cách tận dụng :
-
Thiết lập giá trị mặc định
- Thiết lập giá trị mặc định cho biến trong khi bỏ đi kết quả mở rộng thay vì thực thi nó
: "${DATA_DIR:=/var/data}"
: "${RETRIES:=3}"
-
Làm rỗng tệp và kiểm tra truy cập
- Khi kết hợp với chuyển hướng, nó có thể làm rỗng một hoặc nhiều tệp
: > error.log
: > error.log > access.log
- Cũng có thể dùng subshell và chuyển hướng để kiểm tra khả năng đọc/ghi của tệp
( : < dataset.json ) && echo YES
( : >> result.json ) && echo YES
-
Những vị trí cần một lệnh rỗng
- Có thể dùng khi cú pháp bắt buộc phải có lệnh, như với
trap, nhưng thực tế lại không muốn làm gì
trap : INT
sleep 60
- Cũng có thể đặt vào các nhánh cần để trống trong câu lệnh điều kiện
if some-command; then
:
else
echo "command failed"
fi
-
Kiểm tra nhiều biến
- Khi
set -u đang bật, có thể kiểm tra một lượt xem nhiều biến đã được thiết lập hay chưa
set -u
: "$DEPLOY_ENV" "$HOST"
-
Vòng lặp vô hạn
- Vì
: luôn là điều kiện thành công, có thể viết vòng lặp vô hạn một cách ngắn gọn
while :; do
echo "I love colons"
sleep 1
done
1 bình luận
Các bình luận trên Lobste.rs
: hayalci@tassadar ~/src/dool ; jj rebase -s dxw -d mrnautocdcủa shell và định dạng sau~/directoryname; <command>Mỗi lần sao chép dòng lệnh của shell, nó sẽ tiếp tục
cdvề thư mục nơi lệnh ban đầu được chạyzsh, thiết lập để khi dán khoảng trắng không xuống dòng vô hình thì nội dung bên trái bị xóamakechạy nhiều tiến trìnhechođồng thời và cùng ghi ra một stream, gây can nhiễu lẫn nhau. Nếu đổi như sau, không phải tiến trình con mà chính tiến trìnhmakesẽ in raman :haywhatis :Nó giống lệnh
true, nhưng khác ở chỗ không phản hồi đặc biệt với--help,--version, v.v., và cũng ít ký tự hơnhelpthay vìman:đúng nghĩa là bí danh củatrueTuy nhiên chưa từng nghĩ đến việc tận dụng nó cho tác dụng phụ phát sinh khi đánh giá các đối số
#thay cho:để lưu dưới dạng chú thích. Nếu đó là nội dung sẽ chạy sau, lợi thế là các biểu thức bên trong không bị đánh giá trướchttps://nathangrigg.com/2014/04/zsh-push-line-or-edit/
-bash: !}": event not found"!"thì có hoạt động khôngwhile true; do...while true; dochỉ dài hơnwhile :; doba ký tự nên vẫn đủ ngắn, và đoạn mã đó không có vẻ là ví dụ phù hợp với luận điểm tác giả muốn truyền đạt