Câu trả lời:
Các bí danh giống như các lệnh trong đó tất cả các đối số đối với chúng được truyền dưới dạng đối số cho chương trình mà chúng có bí danh. Ví dụ, nếu bạn đã bí danh lsđể ls -la, sau đó gõ ls foo barsẽ thực sự thực hiện ls -la foo bartrên dòng lệnh.
Nếu bạn muốn có quyền kiểm soát thực tế đối với cách các đối số được diễn giải, thì bạn có thể viết một hàm như vậy:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
Giải pháp bí danh
Nếu bạn thực sự không sử dụng chức năng mỗi lần, bạn có thể sử dụng:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
Bạn có thể thay thế $@bằng $1nếu bạn chỉ muốn đối số đầu tiên.
Giải trình
Điều này tạo ra một hàm tạm thời f, được thông qua các đối số.
Đối số bí danh chỉ được thông qua ở cuối. Lưu ý rằng fđược gọi ở cuối của bí danh.
Việc unset -fxóa định nghĩa hàm khi bí danh được thực thi để nó không bị treo xung quanh sau đó.
wrap_args x y zđưa cho tôi: bash: lỗi cú pháp gần mã thông báo bất ngờ `('
fbí danh. Một khi tôi không thiên vị fnó hoạt động tốt. Cái tên va chạm cũ.
command type f:)
Thêm vào các câu trả lời hiện tại, một điều quan trọng để nhận ra cách hoạt động của các bí danh là tất cả các tham số bạn nhập sau một lệnh bí danh sẽ được sử dụng theo nghĩa đen ở cuối. Vì vậy, không có cách nào để sử dụng bí danh cho hai lệnh (đường ống hoặc không), trong đó đầu tiên nên diễn giải các tham số. Để làm cho nó rõ ràng, đây là một ví dụ về một cái gì đó sẽ không hoạt động như mong đợi:
alias lsswp="ls -l | grep swp"
(một ví dụ lấy cảm hứng từ câu hỏi này ) điều này sẽ luôn sử dụng đầu ra được ls -lthực hiện trong thư mục hiện tại và thực hiện một grep trên đó - vì vậy sử dụng
lsswp / tmp /
sẽ tương đương ls -l | grep swp /tmp/ và không ls -l /tmp/ | grep swp .
Đối với tất cả các mục đích mà các đối số nên được sử dụng ở đâu đó ở giữa, người ta cần sử dụng functionthay thế alias.
Bạn thực sự không phải làm bất cứ điều gì; bí danh làm điều này tự động. Ví dụ:
$ alias less="less -eirqM"
$ less foo.txt
Bạn sẽ thấy trang đầu tiên của foo.txt và lesssẽ thoát tại EOF (-e), các tìm kiếm sẽ không phân biệt chữ hoa chữ thường (-i), v.v.
Tôi đang trả lời cho csh:
Có, bạn có thể sử dụng các tham số trong bí danh và - như một sự khác biệt với những gì đã nói ở trên - bạn có thể tham khảo chúng ở bất cứ đâu trong định nghĩa của bí danh - không chỉ ở cuối.
Ví dụ cho tar-gz -ing một cái gì đó:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, ở đâu !:1và !:2là các tham số bạn sẽ cung cấp khi gọi bí danh của mình.
Ví dụ sử dụng:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
Điều đó có nghĩa là bạn đã sử dụng hai tham số mà bạn đã chèn tại các vị trí tùy ý của lệnh tar, biến tất cả thành một bí danh tgz
shđược xác địnhmy_program_wrapper() { ...; }. Bash không xử lý từ khóafunctionnhưng tại sao không đi với những gì di động hơn?