Làm việc xung quanh các giới hạn bí danh với lệnh nhóm và chuỗi ở đây
Bí danh không thể lấy lý lẽ, nhưng chúng ta có thể "mô phỏng" điều đó. Lấy ví dụ về câu trả lời của tôi cho câu hỏi này .
alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
Những điểm chính đang diễn ra ở đây:
- chúng tôi sử dụng tích
read
hợp để đọc một chuỗi thành một biến d
. Vì chúng tôi muốn đọc một chuỗi đầy đủ bao gồm các ký tự trống (dòng mới, tab, dấu cách), chúng tôi sử dụng IFS=
và vô hiệu hóa các dấu gạch chéo ngược -r
.
<<<
Đây là toán tử chuỗi cho phép chúng ta chuyển hướng bất kỳ chuỗi nào chúng ta cung cấp làm đối số cho mkcd
bí danh; việc sử dụng sẽ làmkcd "some directory"
- nhiều lệnh trong bí danh được kết hợp và thực thi trong shell hiện tại bằng cách sử dụng
{ list; }
cấu trúc (được gọi là group command
trongbash
hướng dẫn). Lưu ý rằng không gian hàng đầu sau {
và ;
danh sách các lệnh được yêu cầu.
Trong ví dụ cụ thể của bạn, chúng tôi có thể làm:
alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'
Chúng tôi cũng có thể sử dụng phân tách từ để lưu trữ các đối số được phân tách bằng dấu cách:
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "arg1 arg2"
arg1
arg2
Hoặc chúng ta có thể sử dụng mảng để cung cấp nhiều đối số:
bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";} <<< "arg1 arg2"
arg2
arg1
Nhưng đây có phải là cách tiếp cận tốt?
Không cần thiết. Vấn đề với cách tiếp cận như vậy là nó rất cụ thể - các đối số không thể được trích dẫn dễ dàng, điều đó có nghĩa là chúng ta chỉ có thể có các đối số không có khoảng trắng.
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "'arg1 with space' arg2"
'arg1
with space' arg2
Tất nhiên đây không phải là thứ sẽ được sử dụng rộng rãi, đơn giản là vì trong thế giới thực, chúng ta phải đối phó với những tranh luận phức tạp, vì vậy cách tiếp cận này không thực tế lắm. Chức năng linh hoạt hơn nhiều. Và sự cần thiết phải trích dẫn chuỗi args trở nên khó chịu nhanh chóng.
Mặc dù có những hạn chế, điều này hoạt động với các chuỗi đơn giản như là các đối số mà chúng ta có thể đủ khả năng phân tách từ, do đó một phần cho phép chúng ta đưa ra các đối số cho các bí danh.