Articles

Bash (shell Unix)

sintaxa comenzii Bash este un superset al sintaxei comenzii shell Bourne. Bash acceptă extinderea bretelelor, finalizarea liniei de comandă (finalizare programabilă), depanarea de bază și manipularea semnalului (folosind trap) de la bash 2.05 a printre alte caracteristici. Bash poate executa marea majoritate a scripturilor shell Bourne fără modificări, cu excepția scripturilor shell Bourne care se împiedică în comportamentul sintaxei fringe interpretat diferit în Bash sau încercarea de a rula o comandă de sistem care se potrivește cu un bash mai nou încorporat etc. Sintaxa comenzii Bash include idei extrase din kornshell (ksh) și shell-ul C (csh), cum ar fi editarea liniei de comandă, istoricul comenzilor (history comandă), stiva directorului, $RANDOM și $PPID variabile și sintaxa de substituție a comenzii POSIX $(…).

când un utilizator apasă tasta tab într-un shell de comandă interactiv, Bash folosește automat finalizarea liniei de comandă, începând cu versiunea beta 2.04, pentru a se potrivi cu numele de programe parțial tastate, numele de fișiere și numele variabilelor. Sistemul de finalizare a liniei de comandă Bash este foarte flexibil și personalizabil și este adesea ambalat cu funcții care completează argumente și nume de fișiere pentru programe și sarcini specifice.

sintaxa lui Bash are multe extensii lipsite de shell-ul Bourne. Bash poate efectua calcule întregi („evaluare aritmetică”) fără a genera procese externe. Acesta utilizează ((…)) comanda și$((…)) sintaxa variabilă în acest scop. Sintaxa sa simplifică redirecționarea I/O. De exemplu, poate redirecționa ieșirea standard (stdout) și eroarea standard (stderr) în același timp folosind operatorul &>. Acest lucru este mai simplu de tastat decât echivalentul shell-ului Bourne ‘command > file 2>&1‘. Bash acceptă substituirea procesului folosind sintaxa<(command) și>(command), care înlocuiește ieșirea (sau intrarea) unei comenzi în care este utilizat în mod normal un nume de fișier. (Acest lucru este implementat prin conducte /proc/fd/ fără nume pe sisteme care acceptă acest lucru sau prin conducte temporare numite acolo unde este necesar).

când se utilizează cuvântul cheie ‘function’, declarațiile funcției Bash nu sunt compatibile cu scripturile Bourne/Korn / POSIX (kornshell are aceeași problemă atunci când se utilizează ‘function’), dar Bash acceptă aceeași sintaxă a declarației funcției ca și shell-urile Bourne și Korn și este conformă cu POSIX. Din cauza acestor diferențe și a altor diferențe, scripturile shell Bash sunt rareori rulabile sub interpreții shell Bourne sau Korn, cu excepția cazului în care sunt scrise în mod deliberat cu acea compatibilitate în minte, care devine din ce în ce mai puțin obișnuită pe măsură ce Linux devine mai răspândit. Dar în modul POSIX, Bash se conformează cu POSIX mai îndeaproape.

Bash acceptă aici documente. Începând cu versiunea 2.05 B Bash poate redirecționa intrarea standard (stdin) dintr-un șir „aici” folosind <<< operator.

Bash 3.0 acceptă potrivirea expresiei regulate în proces folosind o sintaxă care amintește de Perl.

în februarie 2009, Bash 4.0 a introdus suport pentru tablouri asociative. Indicii matricei asociative sunt șiruri, într-un mod similar cu AWK sau Tcl. Ele pot fi folosite pentru a emula matrice multidimensionale. Bash 4 își schimbă, de asemenea, licența la GPLv3; unii utilizatori suspectează că această modificare a licenței este motivul pentru care MacOS continuă să utilizeze versiuni mai vechi. Apple a încetat în cele din urmă să folosească Bash în sistemele lor de operare Odată cu lansarea MacOS Catalina în 2019.

Brace expansionEdit

Brace expansion, numită și alternanță, este o caracteristică copiată din shell-ul C. Acesta generează un set de combinații alternative. Rezultatele generate nu trebuie să existe ca fișiere. Rezultatele fiecărui șir extins nu sunt sortate și se păstrează ordinea de la stânga la dreapta:

$ echo a{p,c,d,b}eape ace ade abe$ echo {a,b,c}{d,e,f}ad ae af bd be bf cd ce cf

utilizatorii nu ar trebui să utilizeze expansiuni bretele în script-uri shell portabile, deoarece shell-ul Bourne nu produce aceeași ieșire.

$ # A traditional shell does not produce the same output$ /bin/sh -c 'echo a{p,c,d,b}e'a{p,c,d,b}e

când expansiunea brace este combinată cu metacaracterele, acoladele sunt extinse mai întâi și apoi metacaracterele rezultate sunt înlocuite în mod normal. Prin urmare, o listă de imagini JPEG și PNG în directorul curent ar putea fi obținute folosind:

ls *.{jpg,jpeg,png} # expands to *.jpg *.jpeg *.png - after which, # the wildcards are processedecho *.{png,jp{e,}g} # echo just show the expansions - # and braces in braces are possible.

În plus față de alternanță, expansiunea bretelelor poate fi utilizată pentru intervale secvențiale între două numere întregi sau caractere separate prin puncte duble. Versiunile mai noi ale Bash permit unui al treilea număr întreg să specifice incrementul.

$ echo {1..10}1 2 3 4 5 6 7 8 9 10$ echo file{1..4}.txtfile1.txt file2.txt file3.txt file4.txt$ echo {a..e}a b c d e$ echo {1..10..3}1 4 7 10$ echo {a..j..3}a d g j

când expansiunea brace este combinată cu expansiunea variabilă, expansiunea variabilă se efectuează după expansiunea brace, care în unele cazuri poate necesita utilizareaeval încorporată, astfel încât:

$ start=1; end=10$ echo {$start..$end} # fails to expand due to the evaluation order{1..10}$ eval echo {$start..$end} # variable expansion occurs then resulting string is evaluated1 2 3 4 5 6 7 8 9 10

Scriptsedit pornire

această secțiune conține instrucțiuni, sfaturi, sau cum să-conținut. Scopul Wikipedia este de a prezenta fapte, nu de a instrui. Vă rugăm să ajutați la îmbunătățirea acestui articol fie prin rescrierea conținutului how-to, fie prin mutarea acestuia la Wikiversity, Wikibooks sau Wikivoyage. (Ianuarie 2019)

când începe Bash, execută comenzile într-o varietate de fișiere dot. Spre deosebire de scripturile shell Bash, fișierele dot nu au de obicei permisiunea de executare activată și nici o directivă de interpretare precum #!/bin/bash.

exemplu de pornire Bash compatibil Legacy

scheletul~/.bash_profile de mai jos este compatibil cu shell-ul Bourne și oferă semantică similară cu csh pentru~/.bashrc și~/.bash_login && cmd este o evaluare de scurtcircuit care testează dacă numele fișierului există și poate fi citit, sărind peste partea după && dacă nu este.

 && . ~/.profile # set up environment, once, Bourne-sh syntax onlyif ; then # are we interactive? && . ~/.bashrc # tty/prompt/function setup for interactive shells && . ~/.bash_login # any at-login tasks for login shell onlyfi # End of "if" block

probleme ale sistemului de Operare în Bash startupEdit

unele versiuni de Unix și Linux conțin scripturi de pornire a sistemului Bash, în general sub directoarele/etc. Bash le numește ca parte a inițializării sale standard, dar alte fișiere de pornire le pot citi într-o ordine diferită de secvența de pornire Bash documentată. Conținutul implicit al fișierelor utilizatorului rădăcină poate avea, de asemenea, probleme, precum și fișierele schelet pe care sistemul le furnizează noilor conturi de utilizator la configurare. Scripturile de pornire care lansează sistemul X window pot face, de asemenea, lucruri surprinzătoare cu scripturile de pornire Bash ale utilizatorului, în încercarea de a configura variabile de mediu utilizator înainte de lansarea managerului de ferestre. Aceste probleme pot fi adesea abordate folosind un~/.xsession sau~/.xprofile fișier pentru a citi~/.profile — care oferă variabilele de mediu pe care bash shell Windows le-a generat din Managerul de ferestre, cum ar fi terminalul Xterm sau Gnome.

PortabilityEdit

invocarea Bash cu--posix opțiune sau precizândset -o posix într-un script face ca Bash să se conformeze foarte strâns standardului POSIX 1003.2. Scripturile shell Bash destinate portabilității ar trebui să ia în considerare cel puțin standardul shell POSIX. Unele caracteristici bash care nu se găsesc în POSIX sunt:

  • anumite opțiuni de invocare extinsă
  • expansiune Brace
  • matrice și matrice asociative
  • suportul dublu ] Construct de test extins și potrivirea sa regex
  • constructul de evaluare aritmetică cu paranteze duble (numai (( ... )) ; $ ((... )) este POSIX)
  • anumite operații șir de manipulare în expansiune parametru
  • local pentru variabile scoped
  • procesul de substituție
  • Bash-specifice builtins
  • Coprocese
  • $EPOCHSECONDS și $EPOCHREALTIME variabile

dacă o bucată de cod folosește o astfel de caracteristică, se numește „bashism”-o problemă pentru utilizarea portabilă. Debian ‘ s checkbashisms și Vidar Holen ‘ s shellcheck pot fi folosite pentru a vă asigura că un script nu conține aceste părți. Lista variază în funcție de shell-ul țintă real: Politica Debian permite unele extensii în scripturile lor (așa cum sunt în dash), în timp ce un script care intenționează să accepte shell-urile pre-POSIX Bourne, cum ar fi configure ale autoconf, sunt și mai limitate în caracteristicile pe care le pot utiliza.

tastatură shortcutsEdit

Articol principal: GNU Readline

Bash utilizează readline pentru a furniza comenzi rapide de la tastatură pentru editarea liniei de comandă utilizând legăturile implicite (Emacs). Legăturile Vi pot fi activate rulând set -o vi.

Process managementEdit

shell-ul Bash are două moduri de execuție pentru comenzi: lot și modul concurent.

pentru a executa comenzi în lot (adică în secvență), acestea trebuie separate prin caracterul „;”, sau pe linii separate:

command1; command2

în acest exemplu, când command1 este terminat, command2 este executat.

o execuție de fundal a comandei1 poate apărea folosind (simbol&) la sfârșitul unei comenzi de execuție, iar procesul va fi executat în fundal revenind imediat controlul în shell și permițând executarea continuă a comenzilor.

command1 &

sau pentru a avea o execuție simultană a două comandă1 și comandă2, acestea trebuie executate în shell-ul Bash în felul următor:

command1 & command2

în acest caz command1 este executat în fundal& simbol, revenind imediat controlul la shell-ul care execută command2 în prim-plan.

un proces poate fi oprit și controlul returnat la bash tastând Ctrl+z în timp ce procesul rulează în prim-plan.

o listă a tuturor proceselor, atât în fundal, cât și oprite, poate fi realizată rulând jobs:

$ jobs- Running command1 &+ Stopped command2

În ieșire, numărul din paranteze se referă la ID-ul lucrării. Semnul plus semnifică procesul implicit pentru bg și fg. Textul” Running „și” Stopped ” se referă la starea procesului. Ultimul șir este comanda care a început procesul.

starea unui proces poate fi modificată folosind diferite comenzi. Comandafg aduce un proces în prim plan, în timp cebg setează un proces oprit care rulează în fundal. bg și fg pot lua un ID de job ca prim argument, pentru a specifica procesul pe care să acționeze. Fără unul, ei folosesc procesul implicit, identificat printr-un semn plus în ieșirea jobs. Comandakill poate fi utilizată pentru a încheia un proces prematur, trimițându-i un semnal. ID-ul jobului trebuie specificat după un semn procentual:

kill %1

condițional executionEdit

Bash furnizează separatoare de comandă „condițional execution” care condiționează executarea unei comenzi de codul de ieșire setat de o comandă precedentă. De exemplu:

cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2

unde ./ do_something este executat numai dacă comanda cd (change directory) a fost „reușită” (a returnat o stare de ieșire de zero) și comanda echo ar fi executată numai dacă cd-ul sau ./ comanda do_something returnează o „eroare” (starea de ieșire diferită de zero).

pentru toate comenzile starea de ieșire este stocată în variabila specială$?. Bash sprijină ,de asemeneadacă ...; atunci ...; altfel ...; fi și caz $variabilă în $model)...;; $ other_pattern)...;; esac forme de evaluare a comenzii condiționale.

Bug reportingEdit

„bashbug” redirecționează aici. Pentru bug-ul raportat pe scară largă din septembrie 2014 găsit în Bash, a se vedea Shellshock (bug software).

o comandă externă numită bashbug raportează bug-uri shell Bash. Când comanda este invocată, Aceasta afișează editorul implicit al Utilizatorului cu un formular de completat. Formularul este trimis prin poștă la întreținătorii Bash (sau opțional la alte adrese de e-mail).

completare Programabilăedit

Bash completare programabil,complete șicompgen comenzi au fost disponibile de la versiunea beta a 2.04 în 2000. Aceste facilități permit completarea inteligentă complexă, cum ar fi oferirea opțiunilor de program disponibile pentru completarea filelor și apoi, după ce utilizatorul selectează o opțiune care necesită un nume de fișier ca intrare următoare, doar completarea automată a căilor de fișiere (și nu a altor opțiuni) pentru următorul jeton.