Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Dễ dàng nhập hàm & biến vào Bash dùng lệnh source

Khi đăng nhập shell Linux, bạn kế thừa môi trường làm việc cụ thể. Môi trường, trong ngữ cảnh shell, nghĩa là có biến đã thiết lập sẵn cho bạn, đảm bảo lệnh hoạt động như dự định. Ví dụ, biến môi trường PATH định nghĩa shell tìm lệnh ở đâu. Nếu không, gần như mọi việc bạn thử trong Bash thất bại với lỗi command not found. Môi trường của bạn, dù phần lớn vô hình khi bạn làm việc hàng ngày, là cực kỳ quan trọng.

Có nhiều cách ảnh hưởng môi trường shell. Bạn sửa file cấu hình như ~/.bashrc và ~/.profile, chạy dịch vụ khi khởi động, và tạo lệnh tùy chỉnh hoặc script hàm Bash riêng.

Thêm vào môi trường với source

Bash (cùng vài shell khác) có lệnh built-in source. Và đây nơi dễ nhầm lẫn: source thực hiện cùng chức năng lệnh . (chỉ một dấu chấm), và nó không phải source giống lệnh Tcl (có thể xuất hiện nếu gõ man source). Lệnh built-in source không ở trong PATH chút nào. Nó là lệnh đi kèm Bash, và để biết thêm, gõ help source.

Lệnh . tuân thủ POSIX. Lệnh source không được POSIX định nghĩa nhưng có thể thay thế cho ..

Theo Bash help, lệnh source thực thi file trong shell hiện tại. Cụm "trong shell hiện tại" quan trọng, vì nghĩa là nó không khởi chạy sub-shell; do đó, bất cứ gì bạn thực thi với source xảy ra trong và ảnh hưởng môi trường hiện tại của bạn.

Trước khi khám phá source ảnh hưởng môi trường như thế nào, thử source trên file test đảm bảo nó thực thi code như mong đợi. Tạo script Bash đơn giản lưu thành file hello.sh:

#!/usr/bin/env bash
echo "hello world"

Dùng source, bạn chạy script này ngay cả không đặt bit thực thi:

$ source hello.sh
hello world

Bạn cũng dùng built-in . cho cùng kết quả:

$ . hello.sh
hello world

Lệnh source và . thành công thực thi nội dung file test.

Đặt biến và nhập hàm

Bạn dùng source để "nhập" file vào môi trường shell, như dùng include trong C/C++ tham chiếu thư viện hoặc import trong Python nhập module. Đây là cách dùng phổ biến nhất cho source, và mặc định thường thấy trong .bashrc để source file .bash_aliases để alias tùy chỉnh nhập vào môi trường khi đăng nhập.

Ví dụ nhập hàm Bash. Tạo hàm trong file myfunctions. In địa chỉ IP công khai và IP cục bộ:

function myip() {
curl https://icanhazip.com

ip addr | grep inet$IP | \
cut -d"/" -f 1 | \
grep -v 127\.0 | \
grep -v \:\:1 | \
awk '{$1=$1};1'
}

Nhập hàm vào shell:

$ source myfunctions

Test hàm mới:

$ myip
93.184.216.34
inet 192.168.0.23
inet6 fbd4:e85f:49c:2121:ce12:ef79:0e77:59d1
inet 10.8.42.38

Tìm kiếm source

Khi dùng source trong Bash, nó tìm file trong thư mục hiện tại. Điều này không xảy ra trong tất cả shell, hãy kiểm tra tài liệu nếu không dùng Bash.

Nếu Bash không tìm thấy file, nó tìm trong PATH. Lại nữa, không phải mặc định mọi shell, kiểm tra tài liệu nếu không dùng Bash.

Đây đều là tiện ích hay trong Bash. Hành vi này mạnh mẽ ngạc nhiên vì cho phép lưu hàm chung ở vị trí tập trung trên ổ cứng và đối xử môi trường như IDE tích hợp. Bạn không lo đâu hàm lưu, vì biết chúng ở tương đương /usr/include cục bộ, nên ở đâu bạn source, Bash đều tìm thấy.

Ví dụ, tạo thư mục ~/.local/include lưu hàm chung, rồi đặt khối code này vào .bashrc:

for i in $HOME/.local/include/*;
do source $i
done

Điều này "nhập" bất kỳ file chứa hàm tùy chỉnh trong ~/.local/include vào môi trường shell.

Bash là shell duy nhất tìm cả thư mục hiện tại và PATH khi dùng source hoặc ..

Dùng source cho mã nguồn mở

Dùng source hoặc . thực thi file là cách tiện lợi ảnh hưởng môi trường giữ thay đổi modular. Lần sau bạn nghĩ copy-paste khối code lớn vào .bashrc, hãy cân nhắc đặt hàm liên quan hoặc nhóm alias vào file chuyên biệt, rồi dùng source để nạp chúng.