2012-04-17 7 views

Trả lời

14

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-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ỏ.

+0

+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

+0

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

+0

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

4
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" 
3

Vâng, duy nhất bạn nên gọi nó với F sth:

F() 
{ 
    echo "$1" > a.txt 
} 

Read more here.