it-swarm-vi.com

Làm thế nào để truyền tham số cho một bí danh?

Đối với tập lệnh bash, tôi có thể sử dụng "[email protected]" để truy cập đối số. Tương đương khi tôi sử dụng bí danh là gì?

77
prosseek

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. Chẳng hạn, nếu bạn là bí danh ls đến ls -la, sau đó gõ ls foo bar would thật sự thực thi 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 "[email protected]"
}
54
amphetamachine

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 "[email protected]" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

Bạn có thể thay thế [email protected] với $1 nếu bạn chỉ muốn đối số đầu tiên.

Giải thích

Điều này tạo ra một hàm tạm thời f, được truyền vào 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 bí danh.

Cá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 đó.

34
Tom Hale

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ủa ls -l được thực hiện trong thư mục current và thực hiện grep trên đó - vì vậy sử dụng

lsswp/tmp /

sẽ tương đương với ls -l | grep swp /tmp/ không ls -l /tmp/ | grep swp.

Đối với tất cả các mục đích sử dụng đối số ở đâu đó ở giữa, người ta cần sử dụng function thay vì alias.

19
rozcietrzewiacz

Bạn không cần phải làm bất cứ điều gì, thực sự; 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.

15
Warren Young

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!: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

1
stevica