lệnh bí danh bash với cả dấu nháy đơn và dấu ngoặc kép


82

Tôi có lệnh này thực hiện những gì tôi muốn nhưng tôi không thể lấy bí danh nó trong .bashrc của mình (lưu ý rằng nó sử dụng cả dấu nháy đơn và dấu ngoặc kép):

svn status | awk '$1 =="M"{print $2;}'

Tôi đã thử:

alias xx="svn status | awk '$1 ==\"M\"{print $2;}'"

Và một số kết hợp thông thường khác mà không có may mắn .. Tôi biết rằng bash rất kén dấu ngoặc kép .. Vậy cách chính xác để đặt bí danh cho nó là gì và tại sao? Cảm ơn

Câu trả lời:


110

Bạn chỉ cần thoát khỏi nó một cách chính xác.

alias xxx="svn status | awk '\$1 ==\"M\"{print \$2;}'"

16
Vì vậy, tôi đã không thoát $ .. không biết điều đó!
pragmatic_programmer

7
Đẹp! Tôi cũng không biết mình phải thoát khỏi '$'!
Shadoninja

1
Câu trả lời hay nhưng cũng là lời nhắc nhở bạn rất dễ mắc sai lầm. Trong trường hợp tôi đang xử lý, đã có những ký tự thoát và nó tạo ra một mớ hỗn độn lớn. Câu trả lời EJK của dưới đây là hữu ích hơn đối với tôi, một chức năng có lẽ là một lựa chọn sạch hơn nhiều :)
jerclarke

1
@jeremyclarke Tôi không đồng ý, thoát rất khó, tránh nó nếu bạn có thể.
ffledgling

Có cần phải trốn thoát không?
Aaron Franke

89

Đây là một cái gì đó có thể đạt được điều tương tự mà không cần sử dụng bí danh. Đặt nó vào một hàm trong .bashrc của bạn:

xx() {
    svn status | awk '$1 =="M"{print $2;}'
}

Bằng cách này, bạn không phải lo lắng về việc nhận được các báo giá vừa phải. Điều này sử dụng cú pháp chính xác giống như bạn làm ở dòng lệnh.


11
+1, nhưng một điều có thể phân minh được - functiontừ khóa không tương thích với POSIX. Chỉ cần bỏ nó đi:xx() { ...
Charles Duffy

5
Tôi không biết điều đó. Cảm ơn.
EJK

1
Đây là đơn giản hơn và tôi thích nó, nhưng một trong những khác trả lời câu hỏi một cách chính xác .. hơn
pragmatic_programmer

13
@pragmatic_programmer Đó là một cách giải thích hợp lý. Cá nhân tôi vẫn cho rằng câu trả lời này là tốt hơn mặc dù không phản hồi theo nghĩa đen - ít nhất 50% thời gian chúng tôi nhận được câu hỏi về bí danh trong irc.freenode.org's #bash, câu trả lời là "sử dụng một hàm thay thế" ; bí danh không thể làm gì khác ngoài việc mở rộng tiền tố, điều này không hữu ích nếu bạn muốn, ví dụ, phân nhánh trên các đối số.
Charles Duffy

7
Đôi khi câu trả lời theo nghĩa đen cho câu hỏi chính xác được ưu tiên hơn nhiều, nhưng hầu hết thời gian, một câu trả lời như câu này hữu ích hơn nhiều vì nó 1) giải quyết vấn đề ban đầu một cách dễ hiểu và 2) mang lại người hỏi một công cụ mới cho dây dao tục ngữ của họ.
TecBrat

3

Kể từ Bash 2.04, có một cách thứ ba (dễ dàng hơn) bên cạnh việc sử dụng một hàm hoặc thoát khỏi cách @ffledgling đã làm: sử dụng cú pháp chuỗi ký tự ( đây là một câu trả lời tuyệt vời ).

Vì vậy, ví dụ: nếu bạn muốn tạo một bí danh của trực tuyến này, nó sẽ kết thúc là:

alias snap-removedisabled=$'snap list --all | awk \'$5~"disabled"{print $1" --revision "$3}\' | xargs -rn3 snap remove'

Vì vậy, bạn chỉ cần thêm $vào trước chuỗi và thoát khỏi các dấu ngoặc kép.

Điều này mang đến một shellcheck cảnh báo bạn có thể vô hiệu hóa một cách an toàn có thể với# shellcheck disable=SC2139 .

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.