Có thể định nghĩa một macro chức năng trong bash nên khi tôi viết:xác định một macro chức năng giống như trong bash
F(sth);
bash chạy này:
echo "sth" > a.txt;
Có thể định nghĩa một macro chức năng trong bash nên khi tôi viết:xác định một macro chức năng giống như trong bash
F(sth);
bash chạy này:
echo "sth" > a.txt;
Không thể thực hiện cú pháp tùy ý để thực hiện bất kỳ điều gì. Dấu ngoặc đơn là metacharacters có ý nghĩa đặc biệt đối với trình phân tích cú pháp, vì vậy không có cách nào bạn có thể sử dụng chúng dưới dạng tên hợp lệ. Cách tốt nhất để mở rộng trình bao là định nghĩa các hàm.
Đây sẽ là một echo
wrapper cơ bản mà luôn viết với cùng file:
f() {
echo "[email protected]"
} >a.txt
này không về cùng nhưng xử lý bổ sung stdin - hy sinh echo's
-e
và -n
lựa chọn:
f() {
[[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}"
} >a.txt
Có thể gọi là
f arg1 arg2...
hoặc
f <file
Chức năng được chuyển đối số theo cách giống như bất kỳ lệnh nào khác.
Trình bao bọc giống như tiếng vang thứ hai đầu tiên kiểm tra cho một set first argument hoặc stdin đến từ một lệnh không có điều kiện và printf bằng cách sử dụng tham số vị trí nếu được đặt hoặc stdin. Biểu thức kiểm tra tránh trường hợp của cả hai đối số zero và không có chuyển hướng từ một tệp, trong trường hợp đó Bash sẽ thử mở rộng đầu ra của thiết bị đầu cuối, treo vỏ.
F() {
echo "$1" > a.txt
}
Bạn don không sử dụng dấu ngoặc đơn khi bạn gọi nó. Đây là cách bạn gọi nó là:
F "text to save"
+1, câu trả lời hay. bạn có muốn giải thích chi tiết hơn tại sao bạn sử dụng cấu trúc phức tạp hơn (nhưng tốt hơn) để xuất (các) đối số? – Kaii
Nó chỉ cho phép đầu vào từ stdin hoặc đối số. Biểu thức kiểm tra ngăn chặn một tình huống trong đó có cả số không arg và stdin là đến từ một thiết bị đầu cuối, trong trường hợp đó vỏ sẽ phải bị giết vì các tiến trình riêng của tty đang nhận đọc và chặn. Nếu nó trôi qua thì các tham số vị trí sẽ được mở rộng nếu được thiết lập, hoặc mở rộng sẽ được đọc từ đầu vào của hàm. Một giải pháp di động nhẹ hơn nhưng chậm hơn là có thể với 'cat' - điều này đòi hỏi một hệ thống với real/dev/fd/*. Tôi chỉ đăng mẹo này vì câu trả lời trước của tôi giống như những câu trả lời khác. :) – ormaaj
cũng vậy, nó cho phép * nhiều đối số * giống như 'echo'. Hàm của bạn làm việc với 'f one two three' trong khi các hàm khác chỉ làm việc với' f 'một hai ba "'. Đưa ra đầu vào mà không có qotes, các giải pháp khác sẽ chỉ lấy từ đầu tiên (ở đây: "một") vào tài khoản. – Kaii