Nhiều kịch bản khởi động Linux, bao gồm kịch bản khởi động SysV, là trong thực tế shell
script. Do đó, sự hiểu biết kịch bản shell là cần thiết nếu bạn muốn
thay đổi một kịch bản khởi động Linux.
Giống như bất kỳ công việc lập trình, kịch bản shell có thể khá phức tạp. Do đó, chương này chỉ gãi bề mặt của những gì có thể được thực hiện thông qua kịch bản shell. Tham khảo một số cuốn sách về chủ đề, chẳng hạn như
Cameron Newham của Học Bash Shell, 3rd Edition (O'Reilly, 2005)
hoặc Richard Blum và Linux Command Line Christine Bresnahan và Shell
Scripting Kinh Thánh, 2nd Edition (Wiley, 2011), để biết thêm thông tin .
Để tạo ra một kịch bản, trước tiên bạn phải biết làm thế nào để bắt đầu chỉnh sửa một. Một khi bạn làm như vậy,
bạn sẽ thấy rằng một trong những nhiệm vụ đơn giản nhất để làm là để gọi lệnh bên ngoài. Nâng cao hơn
nhiệm vụ bao gồm sử dụng các biến và sử dụng các biểu thức điều kiện.
434 Chương 9 ■ Scripts Viết, Cấu hình Email, và sử dụng cơ sở dữ liệu
Bắt đầu một Shell Script
kịch bản Shell được các tập tin văn bản đơn giản, vì vậy bạn tạo chúng trong soạn thảo văn bản. Một kịch bản bắt đầu với
một dòng nhận dạng vỏ mà được sử dụng để chạy nó, chẳng hạn như sau:
#! / Bin / sh
Hai ký tự đầu tiên là một mã số đặc biệt mà nói với các hạt nhân Linux rằng đây là một kịch bản
và sử dụng phần còn lại của các dòng như là một tên đường dẫn đến chương trình đó là để giải thích kịch bản.
(dòng này đôi khi được gọi là xe củ, hashbang, hashpling, hoặc bảng bangline.) Shell
ngôn ngữ kịch bản sử dụng một dấu thăng (#) là một nhân vật bình luận, vì vậy các tiện ích kịch bản bỏ qua
dòng này, mặc dù hạt nhân thì không. Trên hầu hết các hệ thống, / bin / shis một liên kết tượng trưng mà
chỉ vào / bin / bash, nhưng nó có thể chỉ ra một số vỏ khác. Xác định các kịch bản như sử dụng
/ bin / shguarantees rằng bất kỳ hệ thống Linux sẽ có một chương trình shell để chạy các kịch bản; nhưng
nếu các kịch bản sử dụng bất kỳ tính năng specifi c để một lớp vỏ đặc biệt, bạn nên xác định vỏ mà
thay vào đó, ví dụ, sử dụng / bin / bashor / bin / tcshinstead của / bin / sh.
Khi bạn đã hoàn tất việc viết kịch bản shell, bạn nên sửa đổi nó để nó thực thi.
Bạn làm điều này với các chmodcommand, như được mô tả trong Chương 4, "Quản lý tập tin." Cụ thể, bạn sử dụng + xoption thêm quyền thực thi, có thể kết hợp với một
bổ sung thêm các điều khoản cho tất cả người dùng . Ví dụ, để tạo một tập tin gọi là my-scriptexecutable, bạn nên dùng lệnh sau:
$ chmod a + x my-script
Sau đó bạn sẽ có thể thực thi kịch bản bằng cách gõ tên của nó, có thể bắt đầu bằng ./to cho
Linux để chạy các script trong thư mục hiện tại thay vì tìm kiếm những con đường hiện tại. Nếu bạn
không thực hiện các thực thi kịch bản, bạn vẫn có thể chạy các script bằng cách chạy chương trình shell
theo sau là tên script (như trong bash my-script), nhưng nói chung tốt hơn để làm cho
thực thi kịch bản. Nếu kịch bản là một trong những bạn chạy thường xuyên, bạn có thể muốn di chuyển nó đến một vị trí trên con đường của bạn, chẳng hạn như / usr / local / bin. Khi bạn làm điều đó, bạn sẽ không phải gõ
đường dẫn đầy đủ hoặc di chuyển đến thư mục của kịch bản để thực hiện nó; bạn có thể chỉ cần gõ my-script.
Nó có thể thiết lập SUID hoặc SGID bit của một kịch bản. (Xem chương 4 để biết thông tin về SUID và SGID bit.) Làm như vậy là nguy hiểm, đặc biệt là nếu kịch bản được sở hữu bởi root, vì những lý do được mô tả trong
Chương 4. Bạn do đó cần phải rất thận trọng về việc áp dụng các
bit SUID để kịch bản.
Một cách khác để chạy một kịch bản yêu cầu đề cập đến: sourcingit. Bạn có thể nguồn một kịch bản bằng
cách sử dụng các sourcekeyword hoặc một dấu chấm, như sau (.):
$ Nguồn của tôi-script
$. my-script
Sourcing một kịch bản làm cho nó chạy ở shell hiện hành, như trái ngược với phát động mới
dụ của lớp vỏ, như xảy ra khi bạn chạy một kịch bản bằng cách gõ tên của nó một mình hoặc sử dụng các
execcommand, như được mô tả trong Chương 1. Điều này có một số ý nghĩa quan trọng:
Scripts Viết 435
■ Khi bạn nguồn một kịch bản, nó sẽ có quyền truy cập đến các biến môi trường thiết lập trong gọi
vỏ, thậm chí nếu bạn đã không xuất khẩu chúng. Thông thường, chỉ có các biến môi trường mà
bạn một cách rõ ràng xuất khẩu có trở thành có sẵn cho kịch bản mà bạn chạy.
■ Nếu bạn nguồn một kịch bản và nếu kịch bản mà bộ biến môi trường, biến đó sẽ
trở nên có sẵn (hoặc sẽ được thay đổi) trong vỏ gọi. Nếu bạn chạy các kịch bản bình thường, bất kỳ biến môi trường nó đặt sẽ vẫn địa phương để nó và các chương trình mà
nó gọi, thậm chí nếu kịch bản xuất khẩu các biến.
■ Chạy một kịch bản trong những cách bình thường vào các chi phí trên không liên quan với tung ra
chiếc vỏ mới . Các chi phí này thường không đáng kể, nhưng nếu một kịch bản tự gọi đệ quy
hoặc các cuộc gọi nhiều kịch bản khác, tìm nguồn cung ứng các kịch bản này trong kịch bản đầu tiên có thể cải thiện
hiệu suất.
■ Tìm nguồn cung ứng một kịch bản gây ra nó để thực hiện trong ngôn ngữ shell gọi của, trong khi chạy một
kịch bản thường gây ra nó sử dụng ngôn ngữ shell định trên dòng hashbang.
Sử dụng lệnh
Một trong những tính năng cơ bản nhất của kịch bản shell là khả năng chạy các lệnh. Bạn có thể sử dụng
cả vỏ nội lệnh và lệnh bên ngoài. Hầu hết các lệnh bạn gõ vào
dấu nhắc shell là chương trình bên ngoài lệnh-chúng nằm trong / bin, / usr / bin, và
các thư mục khác trên con đường của bạn. Bạn có thể chạy các chương trình như vậy, cũng như các lệnh nội bộ,
do đó có tên của họ trong kịch bản. Bạn cũng có thể chỉ định các tham số cho chương trình như vậy trong
một kịch bản. Ví dụ, giả sử bạn muốn có một kịch bản mà ra mắt hai xtermwindows và các
chương trình đọc email KMail. Bảng liệt kê 9.1 trình bày một kịch bản hoàn thành mục tiêu này.
Listing 9.1: Một kịch bản đơn giản mà ra mắt ba chương trình
# / bin / bash!
/ Usr / bin / xterm &
/ usr / bin / xterm &
/ usr / bin / KMail &
Ngoài dòng đầu tiên mà xác định nó như một kịch bản, kịch bản trông giống như các lệnh bạn có thể gõ vào để thực hiện các công việc bằng tay, ngoại trừ một thực tế: Các kịch bản liệt kê
các đường dẫn đầy đủ cho mỗi chương trình. Điều này thường là không thực sự cần thiết, nhưng danh sách các
đường dẫn đầy đủ đảm bảo rằng kịch bản sẽ tìm các chương trình ngay cả khi PATHenvironment
biến thay đổi. Mặt khác, nếu các tập tin chương trình di chuyển (nói, bởi vì bạn nâng cấp
các gói từ mà họ đang cài đặt và đóng gói quyết định di chuyển chúng), các kịch bản
mà sử dụng đường dẫn đầy đủ sẽ phá vỡ.
Mỗi dòng chương trình khởi động trong Ví dụ 9.1 đầu trong một dấu và (&). Nhân vật này nói với
vỏ để đi vào các dòng tiếp theo mà không cần chờ đợi cho người đầu tiên để kết thúc. Nếu bạn bỏ qua các
ký hiệu trong Liệt kê 9.1, hiệu quả sẽ được rằng xtermwill đầu tiên mở nhưng thứ hai
sẽ không mở cửa cho đến khi người đầu tiên được đóng lại. Tương tự như vậy, KMail sẽ không bắt đầu cho đến khi xterm thứ hai
chấm dứt.
đang được dịch, vui lòng đợi..
