Tôi có thể truyền đối số cho một lệnh bí danh không?


19

Tôi muốn biết nếu tôi có thể vượt qua một đối số bằng lệnh bí danh.

ví dụ:

alias d="dmesg|grep -iw usb|tail -5" 

Bây giờ dsẽ in 5 dòng cuối cùng. Nếu tôi muốn sử dụng d để in một số dòng khác nhau, tôi phải thực hiện thay đổi trong khai báo lệnh bí danh dmột lần nữa.

Có cách nào để tôi có thể sửa đổi khai báo bí danh để tôi không phải gõ lại khai báo để thay đổi số dòng. Giống như kết hợp chuyển số dòng làm đối số trong khi khai báo bí danh cho d? Hoặc có một số phương pháp khác để giải quyết điều này?


Trong (t) csh, "\! *" Tham chiếu các đối số cho một bí danh (dấu gạch chéo ngược chỉ để thoát dấu chấm than thường có nghĩa là "lịch sử") và thậm chí bạn có thể tham chiếu các đối số riêng lẻ, mặc dù tôi không nhớ làm thế nào. Vì vậy, có lẽ "đuôi -n \! *" Hoặc một cái gì đó (tôi không nghĩ \! * Sẽ hoạt động với dấu trừ ngay trước nó). Tuy nhiên, không chắc chắn nếu điều này sẽ làm việc trong (ba) sh.
barrycarter

Câu trả lời:


20

Bí danh không tranh luận. Với một bí danh như thế alias foo='bar $1', $1sẽ được mở rộng bởi shell thành đối số đầu tiên của shell (có khả năng không có gì) khi bí danh được chạy.

Vì vậy: Sử dụng các chức năng , thay vào đó.

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} sử dụng đối số đầu tiên, với giá trị mặc định là 5 nếu không được cung cấp.

Sau đó, bạn có thể làm:

$ d
# prints 5 lines
$ d 10
# prints 10 lines

Hoặc, nếu bạn thay đổi các tùy chọn bạn đã sử dụng một chút:

alias d="dmesg|grep -iw usb|tail -n 5"

Sau đó, bạn có thể vượt qua các -ntùy chọn bổ sung :

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

Nếu nhiều -ntùy chọn được chỉ định cho tail, chỉ cuối cùng được sử dụng.


Đối với các thách thức về mặt chức năng như bản thân mình :) nó có thể hữu ích cho nhà nước một thời gian ngắn nơi để đặt các chức năng ... tức là ~/.bashrchoặc rc.localhoặc bất cứ nơi nào?
WinEunuuchs2Unix

@ WinEunuuchs2Unix bất cứ nơi nào bí danh sẽ được đặt.
muru

5

Bạn cần phải có một chức năng cho việc này như được mô tả trong SOở đây . Hãy thử như sau:

foo() { /path/to/command "$@" ;}

và gọi foovới:

foo arg1 arg2 arg3

4

Làm việc xung quanh các giới hạn bí danh với lệnh nhóm và chuỗi ở đây

Bí danh không thể lấy lý lẽ, nhưng chúng ta có thể "mô phỏng" điều đó. Lấy ví dụ về câu trả lời của tôi cho câu hỏi này .

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

Những điểm chính đang diễn ra ở đây:

  • chúng tôi sử dụng tích readhợp để đọc một chuỗi thành một biến d. Vì chúng tôi muốn đọc một chuỗi đầy đủ bao gồm các ký tự trống (dòng mới, tab, dấu cách), chúng tôi sử dụng IFS=và vô hiệu hóa các dấu gạch chéo ngược -r.
  • <<<Đây là toán tử chuỗi cho phép chúng ta chuyển hướng bất kỳ chuỗi nào chúng ta cung cấp làm đối số cho mkcdbí danh; việc sử dụng sẽ làmkcd "some directory"
  • nhiều lệnh trong bí danh được kết hợp và thực thi trong shell hiện tại bằng cách sử dụng { list; }cấu trúc (được gọi là group commandtrongbash hướng dẫn). Lưu ý rằng không gian hàng đầu sau {;danh sách các lệnh được yêu cầu.

Trong ví dụ cụ thể của bạn, chúng tôi có thể làm:

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

Chúng tôi cũng có thể sử dụng phân tách từ để lưu trữ các đối số được phân tách bằng dấu cách:

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

Hoặc chúng ta có thể sử dụng mảng để cung cấp nhiều đối số:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

Nhưng đây có phải là cách tiếp cận tốt?

Không cần thiết. Vấn đề với cách tiếp cận như vậy là nó rất cụ thể - các đối số không thể được trích dẫn dễ dàng, điều đó có nghĩa là chúng ta chỉ có thể có các đối số không có khoảng trắng.

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

Tất nhiên đây không phải là thứ sẽ được sử dụng rộng rãi, đơn giản là vì trong thế giới thực, chúng ta phải đối phó với những tranh luận phức tạp, vì vậy cách tiếp cận này không thực tế lắm. Chức năng linh hoạt hơn nhiều. Và sự cần thiết phải trích dẫn chuỗi args trở nên khó chịu nhanh chóng.

Mặc dù có những hạn chế, điều này hoạt động với các chuỗi đơn giản như là các đối số mà chúng ta có thể đủ khả năng phân tách từ, do đó một phần cho phép chúng ta đưa ra các đối số cho các bí danh.

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.