Pinakamahusay na kasanayan upang lumikha ng isang Shell Script sa GNU / Linux

Karaniwan kapag nagsimula kang magtrabaho sa Mga lugar ng Administrasyon ng Mga Servers na may GNU / Linux at / o Mga Unix Operating System, nahahanap ang isang tao (mga mukha) na nagtatrabaho sa isang kapaligiran kung saan karaniwang may a grupo ng mga naka-iskedyul na gawain na isinulat ng ibang mga admin at na sa ilang mga oras kailangan natin pamahalaan (pangasiwaan) para malutas ang anumang problema, pagbutihin at / o alisin, upang sumunod sa isang bagong kinakailangan ng Institusyon kung saan siya nagtatrabaho. Kaya't hindi nakakagulat, na anumang bago SysAdmin Sa anumang lugar ng trabaho, nahaharap ka sa mahirap na gawain ng pag-unawa sa ilan sa Shell script nilikha ng iba matandang SysAdmin, na hindi maayos na nakasulat, o nasa isang lohikal o istrakturang pagsulat, hindi madaling maunawaan, o sa pinakamasamang kaso, na may mga utos ng utos, hindi tipiko, luma, hindi mabisa, o nakasulat sa isang mahirap at nakalilito na paraan.

Scripting ng Shell

Habang paglutas ng hindi mahusay na nakasulat na mga script ay palaging isang pansamantalang inis, nagtuturo ito sa sinuman magandang sysadmin Mahalagang bagay. Kung ang isa ay lilikha ng a Shell script upang magamit nang lampas ngayon, ay palaging mas mahusay isulat ang mga ito sa isang napaka-propesyonal at na-standardize na paraan, upang sa paglipas ng panahon, kahit sino pa, o sarili, ay maaaring kasama ang kaunting pagsisikap at kaalaman makamit ang pag-unawa at pangangasiwa sa isang minimum na oras.

Samakatuwid, pagkatapos ng praktikal na serye ng mga publication sa "Alamin ang Shell Scripting" kung saan sinusuri namin ang ilang mga praktikal na script na may simple at pangunahing mga utos, magsisimula kami sa bagong seryeng ito na tinawag "Pinakamahusay na kasanayan upang lumikha ng isang Shell Script sa GNU / Linux", kung saan magtutuon kami nang lubusan sa bawat maliit na aspeto nito at ang dahilan para sa maraming mga bagay, iyon ay, sasakupin namin ang ilang mga tip na gagawing mas mahusay kaming mga script, ngunit hindi gaanong para sa ating sarili, ngunit para sa susunod na tao (SysAdmin) na kailangang pamahalaan ang mga ito. Kaya't hindi mo kailangang dumaan sa nakakapagod at mahirap na gawain ng pag-alam kung ano ang nai-code ko, kung paano at bakit, at kung bakit hindi na ito gumagana.

Sa unang (ika-1) post ng bagong seryeng ito "Pinakamahusay na kasanayan para sa isang mahusay na Shell Script para sa GNU / Linux" Pag-uusapan natin ang tungkol sa kung ano ang pumapasok o dapat pumasok Header ng Shell Script.

=======================================
HEADER - INVOKASYON NG SHELL
=======================================

#! / path / interpret [parameter-argument]

Ang nangungunang linya ay ang pangunahing istraktura kung saan ang isang Shell Script para sa GNU / Linux ay tinawag. Ang mga elemento nito ay maaaring inilarawan tulad ng sumusunod:

#! => sha-bang

Ang sha-bang (#!) sa tuktok ng Script nilikha o nilikha ay isang script na nagsasabi sa aming Operating System na ang aming file ay isang hanay ng mga utos na bibigyan ng feed (bibigyan ng kahulugan) ng interpreter ng utos na ipinahiwatig pagkatapos nito. Ang pares ng tauhan #! talaga, ito ay isang numero ng mahika two-byte, isang espesyal na marker na italaga ang isang uri ng file, at sa aming kaso, isang maipapatupad na script ng shell. Kaagad pagkatapos ng sha-bang dumating ang pangalan ng ang landas kung saan naisasagawa ang interpreter ay matatagpuan kasama ang pangalan ng nasabing interpreter. Sa madaling salita, ito ang landas sa programa na binibigyang kahulugan ang mga utos sa script, kung ito man ay isang interpreter, isang programang wika, o isang utility. Ang shell na ito pagkatapos ay nagpapatupad ng mga utos sa script, na nagsisimula sa itaas (ang linya pagkatapos ng sha-bang), at hindi pinapansin ang anumang mga komento. Ang ilan sha bang maaari silang maging:

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

Ang bawat isa sa mga linya na inilarawan sa itaas (bilang isang halimbawa) ay nag-aanyaya ng ibang shell. Ang linya / Bin / SH, ipatawag ang talukap ng alimango bilang default (Bash sa isang GNU / Linux Operating System) o iba pang katulad. Gamit #! / Bin / SH, ang default na halaga ng Bourne shell Sa karamihan ng mga variant ng komersyal na Operating System na nakabatay sa UNIX, ginagawa itong Script portable sa iba pang Mga Operating System na hindi maayos na Linux, ngunit katulad ng o batay dito o UNIX, kahit na ito ay nagsasakripisyo ng mga tampok na partikular sa BASH. Gayunpaman, ang pagkakasunud-sunod "#! / Bin / sh" umaayon sa pamantayan POSIX sh pamantayan.

Tandaan na ang landas na ibinigay sa sha-bang ay dapat na tama, kung hindi man ay isang mensahe ng error, karaniwan "Hindi nahanap ang utos", ito lamang ang magiging resulta ng pagpapatupad ng script. Tandaan ang pares ng character »#! « maaari itong matanggal kung ang Script ay binubuo lamang ng isang hanay ng mga pangkalahatang utos ng Operating System, iyon ay, nang hindi gumagamit ng panloob na mga direktiba ng Shell. At isiping muli iyon »#! / Bin / sh« inanyayahan ang default na interpreter ng shell, kung saan nagde-default »#! / Bin / bash« sa isang koponan na kasama niya GNU / Linux Operating System.

Na patungkol sa mga argumento, maraming maaaring magamit ngunit ang pinaka-karaniwan ay: »-E«. na gumagawa ng iskrip patunayan ang mga error sa pagpapatupad ng anumang utoso (linya ng pagpapatupad) at kung positibo, pinipilit ang paghinto at paglabas, isang tipikal na ay »-F« para ipahiwatig kung aling script ang mai-load at isa sa pinaka bihira ay »-Rm« na gumaganap ng pagtanggal ng ito sa sandaling ang pagpapatupad nito ay tapos na. Posible lamang na tukuyin sa sha bang hanggang sa solong argumento (parameter) pagkatapos ng pangalan ng program na tatakbo.

At sa wakas, sabihin sa script ang mga pandaigdigang variable na gagamitin mo sa mahahalagang bahagi ng iyong code, para sa pagpapatunay ng mga kaganapan, tulad ng path ng pagpapatupad, awtorisadong gumagamit, pangalan ng script, at iba pa. At magtapos sa data ng programa, tagalikha, samahan, bukod sa iba pa, kasama ang paglilisensya na nalalapat sa programa.

Ang payo ko (Pinakamahusay na kasanayan) upang piliin ang pinakamahusay na sha-bang at heading a Shell script tunog:

#! / usr / bin / env bash

Bakit ginagamit ang utos »Env« Ipinapahiwatig namin sa Operating System ang interpreter na gagamitin gamit ang eksaktong landas na tinukoy sa loob nito bilang default, na nagpapahintulot sa amin na magkaroon ng isang sha bang na nagdaragdag ng kakayahang dalhin nito, dahil hindi sa lahat OS GNU / Linux ang mga tagasalin o programa ay may parehong landas. At walang mga argumento, sapagkat para doon mas mainam na gamitin ang utos itakda, dahil sa kanya kaya natin patunayan ang mga error, pangkalahatan (-e) o tukoy (+ x / -x), o sa malinaw na mga pandaigdigang preset para sa mga variable ng kapaligiran (-i) o tukoy (-u / –unset). At sa wakas, sa magpatupad ng tiyak na (- o) mga pantulong na aksyon sa loob ng iskrip.

Kaya ang aking inirekumendang HEADER ay:

#! / usr / bin / env bash
# Ipahiwatig ang bash interpreter na may ganap na landas ng Operating System.

itakda -o errexit
# Upang masabi ang script na huminto at isara kapag nabigo ang isang utos o linya ng pagpapatupad.

itakda -o pangngalan
# Upang masabi ang script na huminto at magsara kapag sinusubukan ng script na gumamit ng hindi naihayag na mga variable.

itakda -o pipefail
# Upang makuha ang katayuan ng exit ng huling order na nagbalik ng isang hindi-zero na exit code.

# set -o xtrace
# Upang subaybayan kung ano ang tumatakbo. Kapaki-pakinabang para sa pag-debug. Paganahin ito upang suriin ang mga error lamang.

Tandaan na karagdagan na sundin ang mga rekomendasyong ito:

01.- Kilalanin ang iyong code: Ang paggawa ng iyong code na nababasa ay napakahalaga, at ito ay isang bagay na tila nakakalimutan din ng maraming tao. Subukang gawin ang mga kinakailangang indentasyon upang makita ang isang mahusay na istrakturang lohikal sa paningin.

02.- Magdagdag ng mga puwang sa pagitan ng mga seksyon ng code: Makakatulong ito na mas maintindihan ang code, dahil ang spacing ng mga module o seksyon ay tumutulong na mabasa ang code at madaling maunawaan.

03.- Magkomento hangga't maaari tungkol sa code: Sa tuktok (o ibaba) ng bawat Command Order (Linya ng Pagpapatupad) o Seksyon ng Code mainam na magdagdag ng isang paglalarawan ng pagpapaandar ng (mga) script upang ipaliwanag kung ano ang nangyayari sa loob mismo ng code.

04.- Lumikha ng mga variable na may naglalarawang pangalan ng kanilang mga pagpapaandar: Magtalaga ng mga mapaglarawang pangalan ng variable na malinaw na kinikilala ang pagpapaandar kung saan ito malilikha. Bagaman lumikha ka ng pansamantalang mga variable na hindi kailanman gagamitin sa labas ng isang solong bloke ng code, mabuti pa ring maglagay ng isang pangalan na implicitly (layunin) na nagpapaliwanag kung anong mga halaga o pag-andar ang hinahawakan nito.

05.- Gamitin ang syntax VARIABLE = $ (utos) para sa pagpapalit ng utos: Kung nais mong lumikha ng isang variable na ang halaga ay nagmula sa isa pang utos, mayroong dalawang paraan upang gawin ito sa bash. Sa balik tik, iyon ay, kasama ang mga character " , Hal: VARIABLE = `mga parameter ng command -options`, ngunit ito ay nawala na, kaya't ang syntax VARIABLE = $ (utos) ito ang pinaka moderno, tinatanggap at inirekumendang paraan. NO -> DATE = `date +% F` / YES -> DATE = $ (date +% F)

06.- Gumamit ng mga module ng Superuser at Awtorisadong User na mga module ng pagpapatunay at / o mga variable na mayroon o walang password: Upang madagdagan ang mga antas ng seguridad kung kinakailangan.

07.- Gumamit ng mga modyul at / o mga variable ng Pagpapatunay ng Operating System (Distro, Bersyon, Arkitektura): upang maiwasan ang paggamit sa mga hindi naaangkop na platform.

08.- Gumamit ng mga module (pamamaraan / seksyon) upang kumpirmahin ang pagpapatupad ng mga kritikal o batch na aksyon (modules / pagpapaandar): Upang mai-minimize ang mga pagkakamali dahil sa improvisation o kawalang-ingat.

09.- Magbigay ng Mga User Friendly Interfaces (User-friendly): Sa pamamagitan ng Terminal na may mga menu at kulay na may Pag-uusap at Mga graphic interface para sa Pangunahing Mga Gumagamit na may Zenity, Gxmessage. At kung maaari ay gamitin ang suporta ng mga alerto ng sonik na kinikilala ang mga kilalang kaganapan ayon sa tunog. Sinubukan ko hangga't maaari na kaya ng iyong Script gumana ang parehong paraan sa pamamagitan lamang ng pagpapagana at hindi pagpapagana ng mga pagpipilian / modyul / pagpapaandar.

10.- Isama ang mga module ng Malugod at Paalam (mga mensahe): kung kinakailangan upang madagdagan ang pakikipag-ugnayan sa gumagamit.

11.- Magsama ng isang module ng pagpapatotoo ng dobleng pagpapatupad: Lumikha ng isang lock file upang maiwasan ito na maipatupad nang higit sa 1 oras nang sabay.

12.- Rationalize ang laki ng script sa mga panlabas na pag-andar at / o mga module: Kung ang Script ay napakalaki, hatiin ang code gamit ang mga pag-andar o hatiin ang mga ito sa maliit na mga script na tinawag sa pamamagitan ng isang pangunahing.

13.- Panimula sa isang malinaw at maliwanag na paraan ng mga tawag sa iba pang Mga Interpreter (mga wika sa pagprograma) sa loob ng Script: Inaanyayahan ang mga ito nang malinaw sa pamamagitan ng mga linya o modyul.

Halimbawa:

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

Sa mga pahayagan sa hinaharap ay palalawakin namin nang mas detalyado ang bawat isa sa mga kasanayan na inilarawan sa itaas.

At kung may alam kang ibang mabubuting kasanayan, ang sarili mo o ang iba pa, huwag mag-atubiling magbigay ng puna sa kanila upang makagawa ng isang mas kumpletong kompendyum!

Hanggang sa susunod na paglalathala ng bagong seryeng ito.


6 na puna, iwan mo na ang iyo

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   Max j ​​rodriguez dijo

    Isang detalye lang, ito ay "shebang" 😛
    napakahusay na post, mahusay na kasanayan sa pangmatagalan palaging makakatulong upang gawing pamantayan.

  2.   Isa na dumaan dito dijo

    Ang Bash ay hindi ang default na shell sa lahat ng mga pamamahagi, at samakatuwid ang / bin / sh na simbolikong link ay hindi laging tumuturo sa bash. Halimbawa sa Debian (at ipinapalagay ko samakatuwid ang Ubuntu):
    $ ls -l / bin / sh
    lrwxrwxrwx 1 root root 4 aza 8 2014 / bin / sh -> dash
    Ang default na shell samakatuwid sa Debian ay dash. Tingnan dito: https://wiki.debian.org/Shell

  3.   walang pangalan dijo

    Bilang isang tip upang malaman ang Shell na Ginagamit:

    echo $ 0
    echo $ SHELL
    ipadala | grep SHELL

  4.   Ing.Jose Albert dijo

    Tama ka talaga! Sinubukan ko sa DEBIAN 9 at Kali Linux 2.0 at totoo ito! dadalhin ka sa dash Kahit na higit pa ang rekomendasyon ng: #! / Usr / bin / env bash kung ito ang Shell na nais mong gamitin.

    At ikaw ay ganap na tama ito ay shebang, ngunit sa ilang mga website (teknikal na literatura) tinawag nila itong shabang o iba pang mga salita, samakatuwid ang aking pagkalito. Halimbawa:

    Sa computing, ang isang shebang ay ang pagkakasunud-sunod ng character na binubuo ng mga character na pag-sign number at tandang padamdam (#!) Sa simula ng isang script. Tinatawag din itong sha-bang, [1] [2] hashbang, [3] [4] pound-bang, [5] o hash-pling

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

    Y Kabanata 2. Pagsisimula sa Isang Sha-Bang
    Mula sa: http://www.tldp.org/LDP/abs/html/sha-bang.html

  5.   Ing.Jose Albert dijo

    Gayundin: basename $ 0