Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Phân tích cú pháp tệp cấu hình với Bash

Giữ cấu hình chương trình tách biệt với mã là quan trọng. Nó cho phép những người không phải lập trình viên có thể thay đổi cấu hình mà không cần phải sửa đổi mã của chương trình. Với các tệp thực thi nhị phân đã biên dịch, điều đó sẽ là không thể đối với những người không phải là lập trình viên vì nó không chỉ yêu cầu quyền truy cập vào các tệp nguồn (mà chúng ta có với các chương trình mã nguồn mở) mà còn cả tập kỹ năng của lập trình viên. Ít người có điều đó và hầu hết mọi người không muốn học.

Với các ngôn ngữ shell như Bash, truy cập mã nguồn có sẵn theo định nghĩa vì các tập lệnh shell không được biên dịch thành các định dạng nhị phân. Mặc dù tính mở đó, không phải là một ý tưởng đặc biệt hay đối với những người không phải là lập trình viên để root xung quanh các tập lệnh shell và thay đổi chúng. Ngay cả những nhà phát triển và sysadmins có kiến ​​thức cũng có thể thực hiện những thay đổi ngẫu nhiên gây ra lỗi hoặc tệ hơn.

Vì vậy, việc đặt các mục cấu hình vào các tệp văn bản được duy trì dễ dàng cung cấp sự tách biệt và cho phép những người không phải lập trình viên chỉnh sửa các phần tử cấu hình mà không có nguy cơ thực hiện các thay đổi không chủ ý đối với mã. Nhiều nhà phát triển làm điều này cho các chương trình được viết bằng ngôn ngữ biên dịch vì họ không mong đợi người dùng là nhà phát triển. Vì nhiều lý do tương tự, nên thực hiện điều này với các ngôn ngữ shell được thông dịch.

Cách thông thường

Như với nhiều ngôn ngữ khác, bạn có thể viết mã cho chương trình Bash đọc và phân tích cú pháp tệp cấu hình văn bản ASCII, đọc tên biến và đặt giá trị khi mã chương trình thực thi. Ví dụ:tệp cấu hình có thể trông giống như sau:

var1=LinuxGeek46
var2=Opensource.com

Chương trình sẽ đọc tệp đó, phân tích cú pháp từng dòng và đặt các giá trị vào từng biến.

Tìm nguồn cung ứng

Bash sử dụng một phương pháp dễ dàng hơn nhiều để phân tích cú pháp và thiết lập các biến được gọi là tìm nguồn cung ứng . Tìm kiếm một tệp bên ngoài từ một chương trình shell thực thi là một phương pháp đơn giản để bao gồm toàn bộ nội dung của tệp đó vào một chương trình shell. Theo một nghĩa nào đó, điều này rất giống với ngôn ngữ biên dịch include các câu lệnh bao gồm các tệp thư viện trong thời gian chạy. Một tệp như vậy có thể bao gồm bất kỳ loại mã Bash nào, bao gồm cả các phép gán biến.

Như thường lệ, sẽ dễ dàng chứng minh hơn là giải thích.

Đầu tiên, hãy tạo một ~/bin thư mục (nếu nó chưa tồn tại), và đặt nó thành thư mục làm việc hiện tại (PWD). Tiêu chuẩn phân cấp hệ thống tệp Linux xác định ~/bin là nơi thích hợp để người dùng lưu trữ các tệp thực thi của họ.

Tạo một tệp mới trong thư mục này. Đặt tên cho nó là main và làm cho nó có thể thực thi được:

[dboth@david bin]$ touch main
[dboth@david bin]$ chmod +x main
[dboth@david bin]$

Thêm nội dung sau vào tệp thực thi này:

#!/bin/bash
Name="LinuxGeek"
echo $Name

Và thực hiện chương trình Bash này:

[dboth@david bin]$ ./main
LinuxGeek
[dboth@david bin]$

Tạo một tệp mới và gọi nó là ~/bin/data . Tệp này không cần phải chạy được. Thêm thông tin sau vào nó:

# Sourced code and variables
echo "This is the sourced code from the data file."
FirstName="David"
LastName="Both"

Thêm ba dòng vào main chương trình để nó trông giống như sau:

#!/bin/bash
Name="LinuxGeek"
echo $Name
source ~/bin/data
echo "First name: $FirstName"
echo "LastName: $LastName"

Chạy lại chương trình:

[dboth@david bin]$ ./main
LinuxGeek
This is the sourced code from the data file.
First name: David
LastName: Both
[dboth@david bin]$

Có một điều thực sự thú vị nữa cần biết về tìm nguồn cung ứng. Bạn có thể sử dụng một dấu chấm (. ) làm lối tắt cho source yêu cầu. Thay đổi main để thay thế cho . thay cho source :

#!/bin/bash
Name="LinuxGeek"
echo $Name
. ~/bin/data
echo "First name: $FirstName"
echo "LastName: $LastName"

Và chạy lại chương trình. Kết quả phải giống hoàn toàn với lần chạy trước.

Bash bắt đầu

Mọi máy chủ Linux sử dụng Bash — gần như là tất cả vì Bash là trình bao mặc định cho tất cả các bản phân phối — bao gồm một số ví dụ tuyệt vời, được tích hợp sẵn về tìm nguồn cung ứng.

Bất cứ khi nào Bash shell khởi động, môi trường của nó phải được cấu hình để nó có thể sử dụng được. Có năm tệp chính và một thư mục được sử dụng để cấu hình môi trường Bash. Chúng được liệt kê ở đây cùng với các chức năng chính của chúng:

  • /etc/profile :Môi trường toàn hệ thống và các chương trình khởi động
  • /etc/bashrc :Các chức năng và bí danh trên toàn hệ thống
  • /etc/profile.d/ :Thư mục chứa các tập lệnh toàn hệ thống để định cấu hình các công cụ dòng lệnh khác nhau như vimmc và mọi tập lệnh cấu hình tùy chỉnh mà sysadmin tạo ra
  • ~/.bash_profile :Môi trường dành riêng cho người dùng và các chương trình khởi động
  • ~/.bashrc :Bí danh và chức năng dành riêng cho người dùng
  • ~/.bash_logout :Các lệnh dành riêng cho người dùng để thực thi khi người dùng đăng xuất

Cố gắng theo dõi trình tự thực thi thông qua các tệp này và xác định trình tự mà nó sử dụng để khởi tạo Bash không đăng nhập so với khởi tạo Bash đăng nhập. Tôi đã thực hiện việc này trong Chương 17 của Tập 1 trong loạt bài đào tạo về Linux của mình, Sử dụng và quản trị Linux:Zero to sysadmin .

Tôi sẽ cho bạn một gợi ý. Tất cả bắt đầu với ~/.bashrc tập lệnh.

Kết luận

Bài viết này khám phá việc tìm nguồn cung cấp để kéo mã và các phép gán biến vào một chương trình Bash. Phương pháp phân tích cú pháp các biến từ tệp cấu hình này nhanh chóng, dễ dàng và linh hoạt. Nó cung cấp một phương pháp để tách mã Bash khỏi các phép gán biến để cho phép những người không phải là lập trình viên đặt giá trị của các biến đó.