Tôi có thể đặt hàm shell do người dùng định nghĩa ở đâu?


14

Tôi đang lên kế hoạch để tạo ra một chức năng giúp đơn giản hóa mọi thứ cho tôi. Các chức năng sẽ là một cái gì đó như

function lazymode()
{
echo "Hello World!";
}

để khi tôi sử dụng lệnh lazymodetrong shell , nó sẽ xuất ra Hello World!.

Tôi nên đặt tập tin nào do người dùng định nghĩa?

Câu trả lời:


13

Phụ thuộc vào chức năng. Nếu nó chỉ là một lớp lót siêu đơn giản như thế, bạn có thể tạo bí danh hoặc gắn hàm vào ~/.bashrc(một tệp bash tải khi nó khởi động).

Nếu bạn đang tạo ra thứ gì đó cứng hơn một chút, có thể có ý nghĩa hơn khi tạo tập lệnh thực thi của riêng nó trong ~/bin/đó sẽ không tồn tại theo mặc định (nó chỉ là một thư mục) nhưng nên nằm trong đường dẫn của bạn. Hãy nhớ điều này, tập tin sẽ cần phải được thực thi ( chmod +x filename) và bắt đầu với một khổ #!/bin/bashthơ thích hợp .

Tuyến đường thứ hai có một số lợi ích rõ ràng:

  • Dễ dàng hơn để xem những gì có sẵn
  • Một lỗi cú pháp sẽ không làm hỏng hồ sơ của bạn
  • Bạn không cần tiếp tục cung cấp lại cấu hình bash nếu bạn thay đổi tập lệnh
  • Nó có sẵn cho bất kỳ shell nào miễn là đường dẫn đầy đủ được sử dụng hoặc ~/bin/cũng nằm trong đường dẫn cho shell đó (điều này nên có trong hầu hết các trường hợp AFAIK).

Tôi đã sử dụng tùy chọn sau. Hàm của tôi chứa các lệnh xóa các tệp, wget's Something, thực thi các lệnh javac và java. và khi tôi thử nó trên thiết bị đầu cuối gnome, nó không hoạt động tốt. Bạn có nghĩ rằng có một vấn đề?
Abel Melquiades Callejo

Nó làm gì thay thế?
Oli

Nó đã được sửa. Đã sửa thông qua câu trả lời này
Abel Melquiades Callejo

umm ... kịch bản người dùng không nên ở trong tình trạng /usr/local/binlộn xộn với $PATH?
Braiam

Dường như với tôi, một lợi thế nhỏ nhưng đáng nói của việc đưa các chức năng vào ~/.bashrc(vì nó là sourced) là Bash tìm kiếm các chức năng trước khi thực hiện tra cứu PATH.
Zanna

4

Sự lựa chọn tốt nhất sẽ là ~/.bashrctập tin.

Bạn có thể viết định nghĩa hàm shell của bạn trực tiếp trong ~/.bashrc tệp hoặc nếu bạn có nhiều trong số chúng và không muốn làm lộn xộn ~/.bashrctệp của mình , bạn có thể đặt tất cả chúng vào một tệp khác mà bạn chọn - chỉ cần đảm bảo nguồn đó tập tin trong tập tin của bạn ~/.bashrc. Ví dụ: nếu tệp có chức năng của bạn được đặt tên bash_functions, chỉ cần thêm vào ~/.bashrctệp của bạn các dòng:

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

hoặc, tương đương:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

trong đó .chỉ là một đại diện mang tính biểu tượng của source. Các iflàm cho kiểm tra chắc chắn rằng các tập tin /path/to/bash_functionstồn tại trước khi cố gắng để nguồn nó.

Kỹ thuật này rất giống với việc thiết lập các bí danh ~/.bashrcbằng cách tạo một tệp có tên~/.bash_aliases và sử dụng cú pháp tương tự như trên ~/.bashrcđể kiểm tra sự tồn tại của nó và sau đó lấy nguồn.


cảm ơn, nó đã làm việc Nhân tiện, sự khác biệt của nó với .profile là gì? trong một số linux, tôi không thể đặt các hàm trong bashrc
Abel Melquiades Callejo

2
~/.profiletập tin được thực thi bởi trình thông dịch lệnh cho shell đăng nhập. Khi bạn sử dụng GUI và bạn mở thiết bị đầu cuối, tệp đó không được thực thi vì bạn sẽ ở trong vỏ không đăng nhập.
Radu Rădeanu

1

Đây là một thủ tục thiết yếu để khai báo hàm vĩnh viễn:

  1. Mở ~/.bashrctệp trong một trình soạn thảo văn bản. Không quan trọng là trình soạn thảo văn bản nào, miễn là bạn biết cách sử dụng nó và miễn là bạn mở/home/<username>/.bashrc

  2. Vào cuối ~/.bashrckhai báo hàm riêng của bạn, ví dụ:

    find_dirs(){
        find "$1" -type d
    }
  3. Lưu và đóng tập tin.

Các ~/.bashrctập tin là đọc mỗi khi bạn mở vỏ tương tác (có nghĩa là tab mới thiết bị đầu cuối, đăng nhập thông qua ssh, hoặc tty1 mở hoặc bàn giao tiếp ảo khác). Điều này sẽ không có sẵn trong các tập tin kịch bản, bởi vì~/.bashrc không được đọc cho các shell không tương tác. Nó cũng không có sẵn nếu bạn chạy bashvới --norctùy chọn.

Nếu bạn muốn chức năng có sẵn ngay lập tức trong tab hiện đang mở, hãy sử dụng source ~/.bashrc lệnh.


Các hàm lấy các đối số giống như các lệnh thông thường. Ví dụ, $1thông qua $9chỉ ra các tham số vị trí khi bạn gọi một hàm. Trong ví dụ trên chỉ find_dirslấy một tham số vị trí và sẽ được gọi là find_dirs /etc. Bạn cũng có thể sử dụng $@để tham khảo tất cả các tham số vị trí. Chức năng cũng chấp nhận chuyển hướng. Bạn có thể gọi một chức năng với find_dirs $1 > /dev/null; chúng tôi cũng có thể tuyên bố nó như sau:

find_dirs(){
    find "$1" -type d
}

Lưu ý từ man bash: "Các hàm được thực thi trong ngữ cảnh của trình bao hiện tại; không có quy trình mới nào được tạo để giải thích chúng". Điều đó có nghĩa là bạn cũng nên biết các hàm có khả năng thay đổi môi trường thực thi shell của bạn - thay đổi các biến và cài đặt đầu cuối.

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.