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


64

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

Câu trả lời:


50

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 "$@"
}

3
opengroup.org/onlinepub/009695399/utilities/ Hàm Chức năng trong shđược xác định my_program_wrapper() { ...; }. Bash không xử lý từ khóa functionnhưng tại sao không đi với những gì di động hơn?
ephemient

2
@ephemient Rất đúng. Ý tôi là bên cạnh thực tế là mọi người đều sử dụng GNU Bash chứ không phải vỏ POSIX của barebones.
amphetamachine

21

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


Hừm? 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ờ `('
Chế độ xem hình elip

@Elipticalview Hmm, sao chép vấn đề dán? Xác nhận làm việc trên bash 4.4.12.
Tom Hale

1
Tôi đã 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ũ.
Chế độ xem hình elip

command type f:)
Tom Hale

1
tuyệt quá! đó là biến thể lười biếng nhất!
Sergius

19

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


15

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.


Bạn có thể vui lòng xem câu hỏi của tôi - không có giải pháp nào phù hợp với tôi và tôi không được phép bắt đầu một khoản tiền thưởng.
JJD

1
@JJD Người trả lời câu hỏi của bạn là chính xác: bạn muốn có một hàm trong trường hợp đó, không phải là bí danh. Kể từ khi câu trả lời chấp nhận này câu hỏi là về cơ bản giống nhau, câu hỏi của bạn đã được một cách đúng đắn đóng cửa.
Warren Young

1

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.