Các phương pháp hay nhất để tạo Tập lệnh Shell trong GNU / Linux

Thông thường, khi bạn bắt đầu làm việc trên Khu vực quản trị máy chủ với Hệ điều hành GNU / Linux và / hoặc Unix, một người thấy mình (khuôn mặt) làm việc trong một môi trường nơi thường có một loạt các nhiệm vụ đã lên lịch mà các quản trị viên khác đã viết và đến một lúc nào đó chúng ta phải quản lý (quản trị) para giải quyết bất kỳ vấn đề nào, cải thiện và / hoặc loại bỏ, để tuân thủ yêu cầu mới của Tổ chức nơi anh ấy làm việc. Vì vậy, không có gì lạ, rằng bất kỳ quản trị hệ thống Ở bất kỳ nơi làm việc nào, bạn phải đối mặt với nhiệm vụ cồng kềnh là phải hiểu một số Tập lệnh shell do người khác tạo ra SysAdmin cũ, được viết không tốt hoặc có cấu trúc logic hoặc văn viết, không dễ hiểu hoặc trong trường hợp xấu nhất là các lệnh lệnh, không điển hình, cũ, không hiệu quả hoặc được viết một cách vụng về và khó hiểu.

Shell Scripting

Trong khi giải quyết các tập lệnh viết kém luôn là một sự khó chịu nhất thời, điều này dạy cho bất cứ ai tốt SysAdmin một cái gì đó quan trọng. Nếu một người sẽ tạo ra một Tập lệnh shell được sử dụng cho đến tận ngày nay, luôn tốt hơn viết chúng một cách rất chuyên nghiệp và chuẩn, để theo thời gian, bất kỳ ai khác hoặc chính họ có thể với nỗ lực và kiến ​​thức tối thiểu đạt được sự hiểu biết và quản trị trong thời gian tối thiểu.

Do đó, sau loạt bài thực tế về "Tìm hiểu Shell Scripting" nơi chúng tôi xem xét một số tập lệnh rất thực tế với các lệnh đơn giản và cơ bản, chúng tôi sẽ bắt đầu với loạt bài mới này có tên "Các phương pháp hay nhất để tạo Shell Script trong GNU / Linux", nơi chúng tôi sẽ tập trung kỹ lưỡng vào từng khía cạnh nhỏ của nó và lý do của nhiều thứ, tức là chúng tôi sẽ đề cập đến một số mẹo giúp chúng tôi tạo ra các kịch bản tốt hơn, nhưng không quá nhiều cho bản thân mà cho người tiếp theo (SysAdmin) quản lý chúng. Vì vậy, bạn không phải trải qua nhiệm vụ tẻ nhạt và khó khăn là tìm ra những gì tôi viết mã, làm thế nào và tại sao, và tại sao nó không còn hoạt động nữa.

Trong bài đầu tiên (đầu tiên) của loạt phim mới này "Các phương pháp hay nhất để có một Tập lệnh Shell tốt cho GNU / Linux" Chúng ta sẽ nói về những gì sẽ đi hoặc nên đi trong Tiêu đề Shell Script.

===================================
HEADER - MỜI CỦA VỎ
===================================

#! / đường dẫn / diễn giải [tham số-đối số]

Dòng trên cùng là cấu trúc cơ bản mà Shell Script cho GNU / Linux được gọi. Các yếu tố của nó có thể được mô tả như sau:

#! => sha-bang

Tiếng nổ (#!) ở đầu Tập lệnh được tạo hoặc sẽ được tạo là script cho Hệ điều hành của chúng tôi biết rằng tệp của chúng tôi là một tập hợp các lệnh sẽ được cung cấp (sẽ được thông dịch) bởi trình thông dịch lệnh được chỉ định sau nó. Các cặp nhân vật #! thực ra, nó là một con số kỳ diệu hai byte, một điểm đánh dấu đặc biệt chỉ định một loại tệpvà trong trường hợp của chúng tôi, một tập lệnh shell thực thi. Ngay sau sha-bang, tên của đường dẫn nơi trình thông dịch được thực thi cùng với tên của trình thông dịch đã nói. Nói cách khác, đây là đường dẫn đến chương trình thông dịch các lệnh trong tập lệnh, cho dù đó là trình thông dịch, ngôn ngữ lập trình hay tiện ích. Sau đó, shell này thực hiện các lệnh trong script, bắt đầu từ trên cùng (dòng sau sha-bang) và bỏ qua bất kỳ nhận xét nào. Một số sha bang Chúng có thể là:

# / Bin / sh
#! / bin / bash
#! / usr / bin / perl
#! / usr / bin / tcl
#! / bin / sed -f
#! / usr / awk -f

Mỗi dòng được mô tả ở trên (làm ví dụ) gọi một shell khác nhau. Dòng / Bin / sh, gọi shell theo mặc định (Bash trên Hệ điều hành GNU / Linux) hoặc tương tự khác. Sử dụng # / Bin / sh, giá trị mặc định của Vỏ Bourne Trong hầu hết các biến thể thương mại của Hệ điều hành dựa trên UNIX, nó làm cho Tập lệnh được tạo di động đến các Hệ điều hành khác không phải là Linux đúng cách, nhưng tương tự hoặc dựa trên nó hoặc UNIX, mặc dù điều này hy sinh các đặc điểm cụ thể của BASH. Tuy nhiên, trình tự "#! / Bin / sh" phù hợp với tiêu chuẩn Tiêu chuẩn POSIX sh.

Lưu ý rằng đường dẫn trong sha-bang phải đúng, nếu không, một thông báo lỗi, thường là "Lệnh không tìm thấy", nó sẽ là kết quả duy nhất của việc thực thi script. Nhớ cặp ký tự »#! « nó có thể bị bỏ qua nếu Tập lệnh chỉ bao gồm một tập hợp các lệnh Hệ điều hành chung, nghĩa là không sử dụng các lệnh Shell nội bộ. Và hãy ghi nhớ một lần nữa rằng »#! / Bin / sh« gọi trình thông dịch shell mặc định, mặc định là »#! / Bin / bash« trong một đội với anh ấy Hệ điều hành GNU / Linux.

Liên quan đến các đối số, có một số có thể được sử dụng nhưng phổ biến nhất là: »-E«. cái gì tạo nên kịch bản xác thực các lỗi thực thi của bất kỳ lệnh nàoo (dòng thực thi) và nếu tích cực, buộc dừng lại và thoát ra, một điển hình là »-F« para cho biết tập lệnh nào cần tải và một trong những cái hiếm nhất là »-Rm« thực hiện xóa nó sau khi quá trình thực thi kết thúc. Chỉ có thể xác định trong sha bang Lên đến một đối số duy nhất (tham số) sau tên của chương trình sẽ được thực thi.

Và cuối cùng, hãy nói với kịch bản các biến toàn cục bạn sẽ sử dụng trong các phần thiết yếu của mã của mình, để xác thực các sự kiện, chẳng hạn như đường dẫn thực thi, người dùng được ủy quyền, tên tập lệnh, trong số những người khác. Và kết thúc với dữ liệu của chương trình, người tạo, tổ chức, trong số những người khác, cùng với giấy phép áp dụng cho chương trình.

Lời khuyên của tôi (Các phương pháp hay nhất) để chọn sha-bang tốt nhất và hướng tới một Tập lệnh shell âm thanh:

#! / usr / bin / env bash

Tại sao sử dụng lệnh »Env« Chúng tôi cho Hệ điều hành biết trình thông dịch sẽ được sử dụng với đường dẫn chính xác được chỉ định bên trong nó theo mặc định, điều này cho phép chúng tôi có sha bang điều đó làm tăng tính di động của nó, bởi vì không phải tất cả HĐH GNU / Linux thông dịch viên hoặc chương trình có cùng một đường dẫn. Và không có đối số, vì điều đó tốt hơn là sử dụng lệnh định, bởi vì với anh ấy, chúng ta có thể xác thực lỗi, chung chung (-e) hoặc cụ thể (+ x / -x), hoặc để xóa cài đặt trước toàn cục cho các biến môi trường (-i) hoặc (-u / –unset) cụ thể. Và cuối cùng, để thực hiện các hành động bổ sung (- o) cụ thể bên trong script.

Vì vậy, HEADER được đề xuất của tôi sẽ là:

#! / usr / bin / env bash
# Chỉ ra trình thông dịch bash với đường dẫn tuyệt đối theo Hệ điều hành.

đặt -o errexit
# Để yêu cầu tập lệnh dừng và đóng khi một lệnh hoặc dòng thực thi không thành công.

set -o danh từ
# Để yêu cầu tập lệnh dừng và đóng khi tập lệnh cố gắng sử dụng các biến chưa được khai báo.

đặt -o đường ống thất bại
# Để có trạng thái thoát của đơn hàng cuối cùng trả về mã thoát khác XNUMX.

# đặt -o xtrace
# Để theo dõi những gì đang chạy. Hữu ích cho việc gỡ lỗi. Chỉ kích hoạt nó để kiểm tra lỗi.

Hãy nhớ thực hiện thêm các khuyến nghị sau:

01.- Thụt lề mã của bạn: Làm cho mã của bạn có thể đọc được là rất quan trọng và đó là điều mà rất nhiều người dường như cũng quên. Cố gắng tạo ra các vết lõm cần thiết để cảm nhận được cấu trúc logic tốt trong tầm mắt.

02.- Thêm dấu cách giữa các phần mã: Điều này có thể giúp làm cho mã dễ hiểu hơn nhiều, vì khoảng cách giữa các mô-đun hoặc các phần giúp mã dễ đọc và dễ hiểu.

03.- Bình luận càng nhiều càng tốt về mã: Ở đầu (hoặc dưới cùng) của mỗi Lệnh (Dòng thực thi) hoặc Phần mã, lý tưởng nhất là thêm mô tả về chức năng của (các) tập lệnh để giải thích những gì xảy ra trong chính mã.

04.- Tạo các biến với tên mô tả các hàm của chúng: Gán tên biến mô tả để xác định rõ ràng hàm mà nó sẽ được tạo. Ngay cả khi bạn tạo các biến tạm thời sẽ không bao giờ được sử dụng bên ngoài một khối mã duy nhất, thì vẫn nên đặt một cái tên giải thích ngầm (một cách khách quan) những giá trị hoặc chức năng mà nó xử lý.

05.- Sử dụng cú pháp VARIABLE = $ (lệnh) để thay thế lệnh: Nếu bạn muốn tạo một biến có giá trị bắt nguồn từ một lệnh khác, có hai cách để thực hiện trong bash. Với que ngượcnghĩa là với các ký tự `` , Ví dụ: VARIABLE = `tham số lệnh-tùy chọn`, nhưng nó đã không được dùng nữa, vì vậy cú pháp VARIABLE = $ (lệnh) nó là cách hiện đại nhất, được chấp nhận và khuyến khích. KHÔNG -> DATE = `ngày +% F` / CÓ -> DATE = $ (ngày +% F)

06.- Sử dụng mô-đun Superuser và Authorized User Validation và / hoặc các biến có hoặc không có mật khẩu: Để tăng mức độ bảo mật nếu cần thiết.

07.- Sử dụng các mô-đun và / hoặc các biến xác thực của Hệ điều hành (Phân phối, Phiên bản, Kiến trúc): để ngăn chặn việc sử dụng trên các nền tảng không phù hợp.

08.- Sử dụng mô-đun (thủ tục / phần) để xác nhận việc thực hiện các hành động quan trọng hoặc hàng loạt (mô-đun / chức năng): Để giảm thiểu những sai sót do ngẫu hứng hoặc bất cẩn.

09.- Cung cấp giao diện thân thiện với người dùng (Thân thiện với người dùng): By Terminal với menu và màu sắc với Đối thoạiGiao diện đồ họa cho người dùng cơ bản với Zenity, Gxmessage. Và nếu có thể, hãy sử dụng sự hỗ trợ của cảnh báo âm thanh xác định các sự kiện có thể nhận biết được theo âm thanh. Tôi đã cố gắng hết sức để Script của bạn có thể hoạt động theo cả hai cách chỉ bằng cách bật và tắt các tùy chọn / mô-đun / chức năng.

10.- Bao gồm các mô-đun Chào mừng và Chia tay (tin nhắn): trong trường hợp cần thiết để tăng tính tương tác với người dùng.

11.- Bao gồm một mô-đun xác minh thực thi kép: Tạo một tệp khóa cho nó để ngăn nó được thực thi nhiều hơn 1 lần cùng một lúc.

12.- Hợp lý hóa kích thước của script với các chức năng và / hoặc mô-đun bên ngoài: Nếu tập lệnh rất lớn, hãy chia mã sử dụng các hàm hoặc chia chúng thành các tập lệnh nhỏ được gọi bằng một tập lệnh chính.

13.- Lời gọi một cách rõ ràng và hiển nhiên các lệnh gọi đến các Trình thông dịch khác (ngôn ngữ lập trình) trong Tập lệnh: Mời họ rõ ràng theo dòng hoặc mô-đun.

Ví dụ:

# ================================================== #
#!/bin/bash
#Llamando a un interprete externo a BASH
echo 'El siguiente texto será mostrado por el interprete de PERL'
perl -e 'print "Este texto es mostrado por un script PERL embebido.\n";'
exit 0
# ==================================================#
# ==================================================# 
#!/bin/bash #Llamando al interprete de Python. 
echo 'El siguiente es un script de python:'
echo print "Hola, mundo!" | tee $HOME/.testpythonbash.py
python $HOME/.testpythonbash.py exit 0
# ==================================================#

# ======================================================= #
#!/bin/bash
# bash-y-perl.sh

echo "Saludos desde la parte BASH del script."
# Es posible añadir mas comandos BASH aqui.

exit 0
# Fin de la parte BASH del script.

###########################################################

#!/usr/bin/perl
# Esta parte del script se invoca con la opcion -x.

print "Saludos desde la parte PERL del script.\n";
# Podemos añadir mas comandos PERL aqui.

# Fin de la parte PERL del script.
# ======================================================= #
 

Trong các ấn phẩm trong tương lai, chúng tôi sẽ mở rộng chi tiết hơn từng thực hành được mô tả ở trên.

Và nếu bạn biết một số cách làm hay khác, của riêng bạn hoặc của người khác, đừng ngần ngại comment chúng để tạo bản tóm tắt hoàn thiện hơn!

Cho đến khi xuất bản tiếp theo của bộ truyện mới này.


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   Max j ​​rodriguez dijo

    Chỉ một chi tiết, đó là "shebang" 😛
    bài viết rất tốt, các thực hành tốt về lâu dài luôn giúp chuẩn hóa.

  2.   Một người đã đi qua đây dijo

    Bash không phải là trình bao mặc định trên tất cả các bản phân phối và do đó liên kết tượng trưng / bin / sh không phải lúc nào cũng trỏ đến bash. Trong Debian chẳng hạn (và tôi giả sử là Ubuntu):
    $ ls -l / bin / sh
    lrwxrwxrwx 1 root root 4 aza 8 2014 / bin / sh -> gạch ngang
    Do đó, shell mặc định trên Debian là dấu gạch ngang. Xem tại đây: https://wiki.debian.org/Shell

  3.   không tên dijo

    Như một mẹo để biết Shell đang sử dụng:

    echo $ 0
    echo $ SHELL
    gửi đi | grep SHELL

  4.   Jose Albert dijo

    Bạn thực sự đúng! Tôi đã thử trên DEBIAN 9 và Kali Linux 2.0 và đó là sự thật! sẽ đưa bạn đến với. Thậm chí nhiều hơn nữa đề xuất của: #! / Usr / bin / env bash nếu đó là Shell mà bạn muốn sử dụng.

    Và bạn hoàn toàn đúng đó là shebang, nhưng trên một số trang web (tài liệu kỹ thuật) họ gọi nó là shabang hoặc các từ khác, do đó tôi nhầm lẫn. Thí dụ:

    Trong máy tính, một chuỗi là chuỗi ký tự bao gồm các ký tự số và dấu chấm than (#!) Ở đầu một tập lệnh. Nó còn được gọi là sha-bang, [1] [2] hashbang, [3] [4] pound-bang, [5] hoặc hash-pling

    Từ: https://en.wikipedia.org/wiki/Shebang_%28Unix%29

    Y Chương 2. Bắt đầu với Sha-Bang
    Từ: http://www.tldp.org/LDP/abs/html/sha-bang.html

  5.   Jose Albert dijo

    Ngoài ra: basename $ 0