Amalan terbaik untuk membuat Skrip Shell di GNU / Linux

Biasanya apabila anda mula bekerja di Kawasan Pentadbiran Pelayan dengan GNU / Linux dan / atau Sistem Operasi Unix, seseorang mendapati (wajah) bekerja di persekitaran di mana biasanya terdapat banyak tugas berjadual yang ditulis oleh pentadbir lain dan pada suatu ketika kita mesti mengurus (mentadbir) perenggan menyelesaikan sebarang masalah, memperbaiki dan / atau menghapuskan, untuk mematuhi syarat baru Institusi tempat dia bekerja. Jadi tidak pelik, yang baru SysAdmin Di mana-mana tempat kerja, anda menghadapi tugas yang berat untuk memahami beberapa perkara Skrip shell dicipta oleh orang lain SysAdmin lama, yang tidak ditulis dengan baik, atau dalam struktur logik atau tulisan, tidak mudah difahami, atau dalam keadaan terburuk, dengan arahan perintah, tidak tipikal, lama, tidak cekap, atau ditulis dengan cara yang canggung dan membingungkan.

Shell ScriptingSementara itu menyelesaikan skrip yang kurang ditulis selalu menjadi kegusaran sesaat, ini mengajar sesiapa sahaja baik SysAdmin sesuatu yang penting. Sekiranya seseorang akan membuat a Skrip shell untuk digunakan melebihi hari ini selalu lebih baik tuliskannya dengan cara yang sangat profesional dan standard, sehingga dari masa ke masa, orang lain, atau diri sendiri, dapat dengan usaha dan pengetahuan yang minimum mencapai pemahaman dan pentadbiran dalam masa yang minimum.

Oleh itu, selepas siri penerbitan praktikal di "Belajar Skrip Shell" di mana kita meneliti beberapa skrip yang sangat praktikal dengan perintah sederhana dan asas, kita akan bermula dengan siri baru yang disebut ini "Amalan terbaik untuk membuat Skrip Shell di GNU / Linux", di mana kita akan menumpukan perhatian pada setiap aspek kecil dan alasan banyak perkara, iaitu, kita akan merangkumi beberapa petua yang akan membuat kita membuat skrip yang lebih baik, tetapi tidak begitu banyak untuk diri kita sendiri, tetapi untuk orang seterusnya (SysAdmin) harus menguruskannya. Oleh itu, anda tidak perlu melalui tugas yang membosankan dan sukar untuk mengetahui apa yang saya kodkan, bagaimana dan mengapa, dan mengapa ia tidak lagi berfungsi.

Dalam kes ini, jawatan pertama (1) siri baru ini "Amalan terbaik untuk Skrip Shell yang bagus untuk GNU / Linux" Kami akan bercakap mengenai apa yang berlaku atau yang harus dilakukan Pengepala Skrip Shell.

=======================================
KETUA - INVOKASI KEDAI
=======================================

#! / path / interpret [parameter-argumen]

Garis teratas adalah struktur asas dengan menggunakan Shell Script untuk GNU / Linux. Unsur-unsurnya dapat dijelaskan seperti berikut:

#! => sha-bang

The sha-bang (#!) di bahagian atas Skrip yang dibuat atau akan dibuat adalah a skrip yang memberitahu Sistem Operasi kami bahawa fail kami adalah sekumpulan perintah yang akan diberi makan (akan ditafsirkan) oleh jurubahasa arahan yang ditunjukkan setelahnya. Pasangan watak #! sebenarnya, ia adalah nombor sihir dua bait, penanda khas yang tentukan jenis fail, dan dalam kes kami, skrip shell yang boleh dilaksanakan. Sejurus selepas sha-bang muncul nama jalan di mana jurubahasa yang akan dijalankan terletak ditambah dengan nama jurubahasa tersebut. Dengan kata lain, ini adalah jalan ke program yang menafsirkan perintah dalam skrip, sama ada jurubahasa, bahasa pengaturcaraan, atau utiliti. Shell ini kemudian melaksanakan perintah dalam skrip, mulai dari atas (baris setelah sha-bang), dan mengabaikan sebarang komen. Beberapa sha bang boleh:

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

Setiap garis yang dinyatakan di atas (sebagai contoh) memanggil cengkerang yang berbeza. Garisan itu / Bin / sh, memohon shell secara lalai (Bash pada Sistem Operasi GNU / Linux) atau lain-lain yang serupa. Menggunakan #! / Bin / sh, nilai lalai bagi Bourne shell Dalam kebanyakan varian komersial Sistem Operasi berasaskan UNIX, ini menjadikan Skrip dibuat mudah alih ke Sistem Operasi lain yang bukan Linux dengan betul, tetapi serupa atau berdasarkannya atau UNIX, walaupun ini mengorbankan ciri khas BASH. Walau bagaimanapun, urutannya "#! / Bin / sh" menepati norma POSIX sh standard.

Perhatikan bahawa jalan yang diberikan dalam sha-bang mesti betul, jika tidak, mesej ralat, biasanya "Arahan tidak dijumpai", itu akan menjadi satu-satunya hasil pelaksanaan skrip. Ingat pasangan watak »#! « itu dapat dihilangkan jika Skrip hanya terdiri dari sekumpulan perintah Sistem Operasi generik, yaitu, tanpa menggunakan arahan Shell internal. Dan ingat sekali lagi bahawa »#! / Bin / sh« memanggil jurubahasa lalai, yang lalai »#! / Bin / bash« dalam satu pasukan dengannya Sistem Operasi GNU / Linux.

Berkenaan dengan argumen, ada beberapa yang dapat digunakan tetapi yang paling umum adalah: »-E«. yang membuat skrip mengesahkan kesalahan pelaksanaan sebarang arahano (garis pelaksanaan) dan jika positif, memaksa berhenti dan keluar, yang biasa adalah »-F« perenggan nyatakan skrip yang hendak dimuat dan salah satu yang paling jarang berlaku »-Rm« yang melaksanakan penghapusan setelah pelaksanaannya selesai. Hanya boleh ditentukan dalam sha bang sehingga argumen tunggal (parameter) selepas nama program yang akan dilaksanakan.

Dan akhirnya, ceritakan skripnya pemboleh ubah global yang akan anda gunakan di bahagian penting kod anda, untuk pengesahan peristiwa, seperti jalan pelaksanaan, pengguna yang sah, nama skrip, antara lain. Dan diakhiri dengan data program, pencipta, organisasi, antara lain, ditambah dengan perlesenan yang berlaku untuk program ini.

Nasihat saya (Amalan terbaik) untuk memilih sha-bang terbaik dan tajuk a Skrip shell bunyi:

#! / usr / bin / env bash

Mengapa menggunakan arahan »Env« Kami menunjukkan kepada Sistem Operasi jurubahasa yang akan digunakan dengan jalan tepat yang ditentukan di dalamnya secara lalai, yang membolehkan kami mempunyai sha bang bahawa kita meningkatkan mudah alihnya, kerana tidak semuanya OS GNU / Linux jurubahasa atau program mempunyai jalan yang sama. Dan tanpa hujah, kerana untuk itu lebih baik menggunakan perintah menetapkan, kerana dengannya kita dapat mengesahkan kesalahan, umum (-e) atau khusus (+ x / -x), atau ke pratetap global yang jelas untuk pemboleh ubah persekitaran (-i) atau spesifik (-u / –unset). Dan akhirnya, untuk laksanakan tindakan pelengkap khusus (- o) di dalam skrip.

Oleh itu HEADER yang saya cadangkan adalah:

#! / usr / bin / env bash
# Nyatakan penafsir bash dengan jalan mutlak dengan Sistem Operasi.

tetapkan -o errexit
# Untuk memberitahu skrip berhenti dan ditutup apabila arahan atau baris pelaksanaan gagal.

kata nama set -o
# Untuk memberitahu skrip berhenti dan tutup ketika skrip cuba menggunakan pemboleh ubah yang tidak diisytiharkan.

set -o pipefail
# Untuk mendapatkan status keluar dari pesanan terakhir yang mengembalikan kod keluar bukan sifar.

# set -o xtrace
# Untuk mengesan apa yang dijalankan. Berguna untuk penyahpepijatan. Aktifkannya untuk memeriksa kesilapan sahaja.

Jangan lupa untuk mengikuti cadangan ini:

01.- Nyatakan kod anda: Menjadikan kod anda dapat dibaca sangat penting, dan ini juga perkara yang sering dilupakan oleh banyak orang. Cuba buat lekukan yang diperlukan untuk melihat struktur logik yang baik.

02.- Tambahkan ruang antara bahagian kod: Ini dapat membantu menjadikan kod jauh lebih mudah difahami, kerana jarak mengikut modul atau bahagian membantu menjadikan kod dibaca dan mudah difahami.

03.- Komen sebanyak mungkin mengenai kod: Di bahagian atas (atau bawah) setiap Perintah Perintah (Garis Pelaksanaan) atau Bahagian Kod adalah ideal untuk menambahkan penerangan mengenai fungsi urutan perintah untuk menjelaskan apa yang berlaku dalam kod itu sendiri.

04.- Buat pemboleh ubah dengan nama deskriptif fungsinya: Tetapkan nama pemboleh ubah deskriptif yang jelas mengenal pasti fungsi yang akan dibuat. Walaupun anda membuat pemboleh ubah sementara yang tidak akan pernah digunakan di luar blok kod tunggal, tetap bagus untuk meletakkan nama yang secara implisit (objektif) menerangkan nilai atau fungsi yang ditanganinya.

05.- Gunakan sintaks VARIABLE = $ (perintah) untuk penggantian arahan: Sekiranya anda ingin membuat pemboleh ubah yang nilainya berasal dari perintah lain, ada dua cara untuk melakukannya dalam bash. Dengan tanda belakang, dengan watak " , Ejm: VARIABLE = `parameter pilihan-perintah ', tetapi sudah tidak digunakan lagi, jadi sintaksnya VARIABLE = $ (arahan) ia adalah kaedah yang paling moden, diterima dan disyorkan. TIDAK -> TARIKH = `tarikh +% F` / YA -> TARIKH = $ (tarikh +% F)

06.- Gunakan modul dan / atau pemboleh ubah Pengesahan Pengguna dan Pengguna yang Sah dengan atau tanpa kata laluan: Untuk meningkatkan tahap keselamatan sekiranya perlu.

07.- Gunakan modul dan / atau pemboleh ubah Pengesahan Sistem Operasi (Distro, Version, Architecture): untuk mengelakkan penggunaan pada platform yang tidak sesuai.

08.- Gunakan modul (prosedur / bahagian) untuk mengesahkan pelaksanaan tindakan kritikal atau kumpulan (modul / fungsi): Untuk mengurangkan kesalahan kerana improvisasi atau kecerobohan.

09.- Sediakan Antaramuka Mesra Pengguna (Mesra Pengguna): Dengan Terminal dengan menu dan warna dengan Dialog dan Antara Muka Grafik untuk Pengguna Asas dengan Zenity, Gxmessage. Dan jika boleh gunakan sokongan amaran sonik untuk mengenal pasti peristiwa yang dapat dikenali mengikut suara. Saya cuba seboleh mungkin Skrip anda dapat jalankan kedua-dua cara hanya dengan menghidupkan dan mematikan pilihan / modul / fungsi.

10.- Sertakan modul Selamat Datang dan Perpisahan (mesej): jika perlu untuk meningkatkan interaktiviti dengan pengguna.

11.- Sertakan modul pengesahan pelaksanaan dua kali: Buat fail kunci untuk mengelakkannya dijalankan lebih dari 1 kali pada masa yang sama.

12.- Rasionalkan ukuran skrip dengan fungsi luaran dan / atau modul: Sekiranya Skrip sangat besar, bahagikan kod menggunakan fungsi atau bahagikannya ke dalam skrip kecil yang dipanggil melalui yang utama.

13.- Permintaan dengan cara yang jelas dan jelas panggilan kepada Jurubahasa lain (bahasa pengaturcaraan) dalam Skrip: Jemput mereka dengan jelas mengikut baris atau modul.

Contoh:

# ================================================== #
#!/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.
# ======================================================= #
 

Dalam penerbitan akan datang, kami akan memperluas dengan lebih terperinci setiap amalan yang dinyatakan di atas.

Dan jika anda mengetahui beberapa amalan baik anda sendiri atau yang lain, sila beri komen untuk membuat kompendium yang lebih lengkap!

Sehingga penerbitan siri baru ini.


Kandungan artikel mematuhi prinsip kami etika editorial. Untuk melaporkan ralat, klik di sini.

6 komen, tinggalkan komen anda

Tinggalkan komen anda

Alamat email anda tidak akan disiarkan.

*

*

  1. Bertanggungjawab atas data: Miguel Ángel Gatón
  2. Tujuan data: Mengendalikan SPAM, pengurusan komen.
  3. Perundangan: Persetujuan anda
  4. Komunikasi data: Data tidak akan disampaikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Pangkalan data yang dihoskan oleh Occentus Networks (EU)
  6. Hak: Pada bila-bila masa anda boleh menghadkan, memulihkan dan menghapus maklumat anda.

  1.   Max j ​​rodriguez kata

    Hanya satu perincian, itu "shebang" 😛
    jawatan yang sangat baik, amalan yang baik dalam jangka masa panjang selalu membantu menyeragamkan.

  2.   Satu yang dilalui di sini kata

    Bash bukan shell lalai pada semua pengedaran, dan oleh itu pautan simbol / bin / sh tidak selalu menunjuk ke bash. Dalam Debian misalnya (dan saya menganggap Ubuntu):
    $ ls -l / bin / sh
    lrwxrwxrwx 1 root root 4 aza 8 2014 / bin / sh -> tanda sempang
    Oleh itu shell lalai pada Debian adalah tanda hubung. Lihat sini: https://wiki.debian.org/Shell

  3.   tidak bernama kata

    Sebagai petua untuk mengetahui Shell yang Digunakan:

    bergema $ 0
    gema $ SHELL
    hantar | grep SHELL

  4.   Jose Albert kata

    Anda memang betul! Saya menguji pada DEBIAN 9 dan Kali Linux 2.0 dan itu benar! membawa anda berlari. Lebih-lebih lagi cadangannya adalah: #! / Usr / bin / env bash jika itu adalah Shell yang ingin anda gunakan.

    Dan anda betul-betul betul itu adalah shebang, tetapi di beberapa laman web (literatur teknikal) mereka menyebutnya shabang atau kata-kata lain, maka kebingungan saya. Contoh:

    Dalam pengkomputeran, shebang adalah urutan watak yang terdiri daripada tanda nombor watak dan tanda seru (#!) Pada awal skrip. Ia juga disebut sha-bang, [1] [2] hashbang, [3] [4] pound-bang, [5] atau hash-pling

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

    Y Bab 2. Bermula Dengan Sha-Bang
    Daripada: http://www.tldp.org/LDP/abs/html/sha-bang.html

  5.   Jose Albert kata

    Juga: nama asas $ 0