2009-04-16 38 views
133

Tôi muốn xác định bí danh chạy hai lệnh sau liên tiếp.Nhiều lệnh trong bí danh cho bash

gnome-screensaver 
gnome-screensaver-command --lock 

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

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

để .bashrc của tôi, nhưng kể từ khi tôi khóa máy trạm của tôi vì vậy thường nó sẽ được dễ dàng hơn để chỉ cần gõ một lệnh.

Trả lời

260

Hãy thử:

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

hoặc

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 đối số.

+5

không nên đó là "khóa function() {} blah" ? – emeraldjava

+7

Tôi sử dụng cú pháp 'sh', cũng hoạt động với' bash'. – mouviciel

+2

Làm cách nào để vượt qua đối số? Biến Nesting 'msg' bên trong 'lock()' dấu ngoặc đơn cho lỗi 'lỗi cú pháp gần mã thông báo không mong muốn' msg'' .. – geotheory

11

Điều này có hiệu quả không?

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

này sẽ chạy 2 lệnh cái khác:

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

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

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

này không hoạt động tốt nếu bạn muốn cung cấp luận cứ cho lệnh đầu tiên. Cách khác, tạo một tập lệnh tầm thường trong thư mục $ HOME/bin của bạn.

9

Bí danh có nghĩa là dành cho bí danh tên lệnh. 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. ll chỉ là một loại hơi cụ thể của ls.

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

Hàm là một lệnh mới có logic nội bộ. Nó không chỉ đơn giản là đổi tên 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ữ trình bao Bash rất hạn chế về khả năng chúng vô cùng phù hợp với bất kỳ thứ gì liên quan đến nhiều hơn một lệnh đơn. Sử dụng chúng để tạo ra một đột biến nhỏ của một lệnh duy nhất, không có gì hơn.

Kể từ khi ý định là để tạo ra một lệnh mới mà thực hiện một hoạt động mà trong nội bộ sẽ giải quyết trong các lệnh khác, câu trả lời đúng duy nhất là sử dụng một chức năng ở đây:

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

Sử dụng bí danh trong một kịch bản như điều này xảy ra rất nhiều vấn đề. Trái ngược với các hàm, được thực hiện 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 bí danh "lệnh" này với các lệnh khác. Chúng cũng không hoạt động trong các tập lệnh.

+0

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. đang chờ cập nhật. –

56

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 trông giống như lệnh thứ hai phụ thuộc vào lệnh đầu tiên đang thoát thành công. Bạn có thể muốn thử số short-circuit evaluation trong bí danh của mình:

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

Bây giờ, lệnh thứ hai sẽ không được thực hiện 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 số SO question này.

+4

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

+3

Có lẽ vì git fetch đã trả về một số thứ khác 0? – RobAu

+0

Đã được trợ giúp! Làm việc cho tôi trên Xubuntu 16.04.3 –

0

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

bạn nên đi vào cùng một vấn đề trong việc công bố các bí danh của bạn, bạn có thể tham khảo các link sau đây để giải quyết vấn đề:

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