Nhiều lệnh trong một bí danh cho bash


209

Tôi muốn xác định một bí danh chạy hai lệnh sau liên tiếp.

gnome-screensaver
gnome-screensaver-command --lock

Ngay bây giờ tôi đã thêm

alias lock='gnome-screensaver-command --lock'

vào .bashrc của tôi nhưng vì tôi khóa máy trạm của mình nên thường chỉ cần gõ một lệnh.

Câu trả lời:


390

Thử:

alias lock='gnome-screensaver; gnome-screensaver-command --lock'

hoặc là

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

trong .bashrc của bạn

Giải pháp thứ hai cho phép bạn sử dụng các đối số.


7
không nên là "khóa chức năng () {blah}"?
emeraldjava

2
Làm thế nào để bạn vượt qua tranh luận? Biến lồng nhau 'thông điệp ' bên trong lock()dấu ngoặc đơn đưa ra thông báo syntax error near unexpected token lỗi'` ..
geotheory

8
Khi hàm đã được xác định, nó hoạt động giống như một lệnh: các đối số nằm trên dòng lệnh, được phân tách bằng khoảng trắng. Về phần khai báo, các đối số là $1, $2... trong thân hàm.
mouviciel

1
Downvote không bao gồm dòng bí danh cho với params.
Philip Rego

1
@PhilipRego - Tôi sẽ rất vui khi được học từ bạn và nêu lên câu trả lời của bạn.
mouviciel

79

Các câu trả lời khác trả lời câu hỏi đầy đủ, nhưng ví dụ của bạn có vẻ như lệnh thứ hai phụ thuộc vào câu thứ nhất đang thoát thành công. Bạn có thể muốn thử đánh giá ngắn mạch trong bí danh của mình:

alias lock='gnome-screensaver && gnome-screensaver-command --lock'

Bây giờ lệnh thứ hai thậm chí sẽ không được thử trừ khi lệnh đầu tiên thành công. Một mô tả tốt hơn về đánh giá ngắn mạch được mô tả trong câu hỏi SO này .


5
Đáng ngạc nhiên, thử điều này với git fetch && git pull origin mastervà không làm việc cho tôi cho đến khi tôi thay thế &&với ;.
hakunin

3
Có lẽ bởi vì git fetch đã trả về một cái gì đó khác 0?
RobAu

Đã giúp! Làm việc cho tôi trên Xubfox 16.04.3
Fernando León

Downvote không bao gồm dòng bí danh cho với params.
Philip Rego

18

Bí danh có nghĩa là cho các tên lệnh danh. Bất cứ điều gì ngoài đó nên được thực hiện với các chức năng.

alias ll='ls -l' # The ll command is an alias for ls -l

Bí danh là tên vẫn được liên kết với tên gốc. llchỉ là một loại hơi cụ thể ls.

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    elif exists diff; then
        diff -ur "$@"
    elif exists comm; then
        comm -3 "$1" "$2"
    fi | less
}

Hàm là một lệnh mới có logic bên trong. Nó không chỉ đơn giản là đổi tên của một lệnh khác. Nó hoạt động nội bộ.

Về mặt kỹ thuật, các bí danh trong ngôn ngữ shell Bash bị hạn chế về khả năng đến mức chúng cực kỳ phù hợp với bất kỳ thứ gì liên quan đến nhiều hơn một lệnh . Sử dụng chúng để tạo một đột biến nhỏ của một lệnh, không có gì hơn.

Vì ý định là tạo một lệnh mới thực hiện một thao tác mà bên trong sẽ giải quyết trong các lệnh khác, nên câu trả lời đúng duy nhất là sử dụng một hàm ở đây:

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

Việc sử dụng các bí danh trong một kịch bản như thế này gặp rất nhiều vấn đề. Trái với các hàm được thực thi dưới dạng các lệnh, các bí danh được mở rộng thành lệnh hiện tại, điều này sẽ dẫn đến các vấn đề rất bất ngờ khi kết hợp "lệnh" bí danh này với các lệnh khác. Họ cũng không làm việc trong các kịch bản.


Sẽ là tốt nhất nếu bạn có thể cung cấp bất kỳ ví dụ nào với câu trả lời của bạn. chờ cập nhật.
Sajid Ali

1
Downvote không bao gồm dòng bí danh cho với params.
Philip Rego

2
Các bí danh @PhilipRego không lấy tham số. Đừng bỏ phiếu cho quả táo không có màu cam. Ăn một quả cam thay thế. Như câu trả lời giải thích rất rõ, công cụ phù hợp ở đây không phải là bí danh mà là các chức năng.
lhunath

Ý tôi là những thông số như thế này. Tôi đã sử dụng dấu ngoặc kép sai. alias = "git commit -m 'init'; git đẩy; git status"
Philip Rego

@PhilipRego Bạn thực sự cần sử dụng một hàm chứ không phải bí danh. gps() { git commit -m 'init '; git push; git status; } Như đã giải thích, bí danh là vô cùng hạn chế, mong manh và mục đích duy nhất của họ là đổi tên các lệnh. Lạm dụng chúng cho các mục đích không liên quan sẽ đưa bạn vào nước nóng, chẳng hạn như bạn vừa trải nghiệm.
lhunath

11

Điều này không hoạt động?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'

4

Điều này sẽ chạy 2 lệnh lần lượt:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'

1

Vì vậy, sử dụng một dấu chấm phẩy:

alias lock='gnome-screensaver; gnome-screen-saver-command --lock'

Điều này không hoạt động tốt nếu bạn muốn cung cấp đối số cho lệnh đầu tiên. Hoặc, tạo một tập lệnh tầm thường trong thư mục $ HOME / bin của bạn.


0

Thêm 2 xu của tôi vào cuộc thảo luận 11 tuổi, hãy thử điều này:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"


0

Thêm chức năng này vào ~/.bashrcvà khởi động lại thiết bị đầu cuối của bạn hoặc chạysource ~/.bashrc

function lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

Bằng cách này, hai lệnh này sẽ chạy bất cứ khi nào bạn nhập lockvào thiết bị đầu cuối của bạn.

Trong trường hợp cụ thể của bạn, việc tạo một aliascó thể hoạt động, nhưng tôi không khuyên bạn nên làm điều đó. Theo trực giác, chúng tôi sẽ nghĩ rằng giá trị của một bí danh sẽ chạy giống như khi bạn nhập giá trị trong thiết bị đầu cuối. Tuy nhiên, đó không phải là trường hợp:

Các quy tắc liên quan đến định nghĩa và sử dụng bí danh có phần khó hiểu.

Đối với hầu hết mọi mục đích, các hàm shell được ưa thích hơn các bí danh.

Vì vậy, không sử dụng bí danh trừ khi bạn phải. https://ss64.com/bash/alias.html


-3

Tôi gặp một vấn đề khi khai báo bí danh ~/.bashrc. Thiết bị đầu cuối của tôi không nhận ra bí danh mà tôi đã khai báo ~/.bashrc. Tôi đã học được từ bài viết (đính kèm ở phía dưới) rằng Mac OS X chạy login-shelltheo mặc định do đó nó gọi ~/.bash_profilethay vì ~/.bashrc.

Nếu bạn gặp vấn đề tương tự khi khai báo bí danh của mình, bạn có thể tham khảo liên kết sau để giải quyết vấn đề:

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html


QA này là về nhiều lệnh trong một bí danh, không phải là nơi đặt các bí danh.
facuq

Tôi luôn thực hiện source .bashrcsau khi lưu các thay đổi vào tệp, để cho phép bí danh được nhận dạng mà không cần đăng xuất.
Scott Fleming
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.