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 bar
sẽ thực sự thực hiện ls -la foo bar
trê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 $1
nế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 -f
xó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ờ `('
f
bí danh. Một khi tôi không thiên vị f
nó 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 -l
thự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 function
thay 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à less
sẽ 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 !:1
và !:2
là 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óafunction
nhưng tại sao không đi với những gì di động hơn?