Bash (powłoka Uniksowa)
składnia polecenia Bash jest nadrzędnym składnią polecenia powłoki Bourne ’ a. Bash obsługuje Rozszerzanie nawiasów klamrowych, uzupełnianie wiersza poleceń (Programowalne uzupełnianie), podstawowe debugowanie i obsługę sygnałów (używając trap
) od bash 2.05 a między innymi. Bash może wykonywać zdecydowaną większość skryptów powłoki Bourne 'a bez modyfikacji, z wyjątkiem skryptów powłoki Bourne’ a potykających się o zachowanie składni fringe interpretowane inaczej w Bash lub próbujących uruchomić polecenie systemowe pasujące do nowszego wbudowanego Basha itp. Składnia polecenia Bash zawiera pomysły zaczerpnięte z KornShell (ksh) i powłoki C (csh), takie jak edycja wiersza poleceń, historia poleceń (history
), stos katalogów, $RANDOM
I $PPID
oraz składnia zastępowania poleceń POSIX $(…)
.
gdy użytkownik naciśnie klawisz tab w interaktywnej powłoce poleceń, Bash automatycznie używa uzupełniania wiersza poleceń, od wersji beta 2.04, aby dopasować częściowo wpisane nazwy programów, nazwy plików i nazwy zmiennych. System uzupełniania wiersza poleceń Bash jest bardzo elastyczny i konfigurowalny i często jest pakowany z funkcjami, które uzupełniają argumenty i nazwy plików dla określonych programów i zadań.
składnia Basha ma wiele rozszerzeń, których brakuje w powłoce Bourne ’ a. Bash może wykonywać obliczenia całkowite („arytmetyczna ocena”) bez wywoływania zewnętrznych procesów. Używa do tego celu polecenia((…))
oraz składni zmiennej$((…))
. Jego składnia upraszcza przekierowanie We / Wy. Na przykład może przekierować standardowe wyjście (stdout) i standardowy błąd (stderr) w tym samym czasie za pomocą operatora &>
. Jest to prostsze do wpisania niż odpowiednik powłoki Bourne ’ a ’command > file 2>&1
’. Bash obsługuje zastępowanie procesów za pomocą<(command)
I>(command)
składni, która zastępuje wyjście (lub wejście) polecenia, w którym zwykle używana jest nazwa pliku. (Jest to realizowane przez rury/proc/ fd / unnamed w systemach, które je obsługują, lub przez tymczasowe rury nazwane, jeśli to konieczne).
podczas używania słowa kluczowego 'function’, deklaracje funkcji Bash nie są kompatybilne ze skryptami Bourne/Korn/POSIX (KornShell ma ten sam problem podczas używania 'function’), ale Bash akceptuje taką samą składnię deklaracji funkcji jak powłoki Bourne ’ a i Korna i jest zgodny z POSIX. Z powodu tych i innych różnic, skrypty powłoki Bash rzadko są uruchamiane pod interpreterami powłoki Bourne ’ a lub Korna, chyba że celowo zostały napisane z myślą o tej kompatybilności, co staje się coraz mniej powszechne w miarę jak Linux staje się bardziej rozpowszechniony. Ale w trybie POSIX, Bash jest bardziej zgodny z POSIX.
Bash obsługuje tutaj dokumenty. Od wersji 2.05 B Bash może przekierowywać standardowe wejście (stdin) z” Here string”używając operatora <<<
.
Bash 3.0 obsługuje procesowe dopasowywanie wyrażeń regularnych przy użyciu składni przypominającej Perl.
w lutym 2009 r.Bash 4.0 wprowadził obsługę tablic asocjacyjnych. Indeksy tablicy asocjacyjnej są ciągami, w sposób podobny do AWK lub TCL. Mogą być używane do emulowania tablic wielowymiarowych. Bash 4 zmienia również licencję na GPLv3; niektórzy użytkownicy podejrzewają, że ta zmiana licencji jest powodem, dla którego MacOS nadal korzysta ze starszych wersji. Apple w końcu przestał używać Bash w swoich systemach operacyjnych wraz z wydaniem MacOS Catalina w 2019.
rozszerzenie Nawiasówedytuj
Rozszerzenie nawiasu, zwane również alternacją, jest funkcją skopiowaną z powłoki C. Generuje zestaw alternatywnych kombinacji. Wygenerowane wyniki nie muszą istnieć jako pliki. Wyniki każdego rozwiniętego łańcucha nie są sortowane i zachowana jest kolejność od lewej do prawej:
$ 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
użytkownicy nie powinni używać rozszerzeń brace w przenośnych skryptach powłoki, ponieważ powłoka Bourne ’ a nie wytwarza tego samego wyjścia.
$ # 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
gdy Rozszerzanie nawiasów klamrowych jest połączone z symbolami wieloznacznymi, nawiasy klamrowe są najpierw rozszerzane, a następnie wynikowe symbole wieloznaczne są normalnie zastępowane. W związku z tym listę obrazów JPEG i PNG w bieżącym katalogu można uzyskać za pomocą:
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.
oprócz przemienności można zastosować rozszerzenie nawiasów klamrowych dla zakresów sekwencyjnych między dwiema liczbami całkowitymi lub znakami oddzielonymi podwójnymi kropkami. Nowsze wersje Bash pozwalają trzeciej liczbie całkowitej określić przyrost.
$ 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
gdy rozszerzenie nawiasu jest połączone z rozszerzeniem zmiennej, rozszerzenie zmiennej jest wykonywane po rozszerzeniu nawiasu, co w niektórych przypadkach może wymagać zastosowania wbudowanegoeval
, a zatem:
$ 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
Skrypty Startoweedit
Kiedy Bash uruchamia się, wykonuje polecenia w różnych plikach kropek. W przeciwieństwie do skryptów powłoki Bash, pliki dot zazwyczaj nie mają włączonego uprawnienia do wykonywania ani dyrektywy interpretera ,takiej jak#!/bin/bash
.
przykład uruchamiania Bash zgodnego z Legacy ’ Medit
szkielet~/.bash_profile
poniżej jest kompatybilny z powłoką Bourne ’ a i nadaje semantykę podobną do csh dla~/.bashrc
I~/.bash_login
&& cmd
jest ewaluacją zwarciową, która sprawdza, czy nazwa pliku istnieje i jest czytelna, pomijając część po &&
, jeśli tak nie jest.
&& . ~/.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
problemy z systemem operacyjnym w Bash startupEdit
niektóre wersje systemów Unix i Linux zawierają skrypty startowe systemu Bash, zwykle w katalogach/etc
. Bash wywołuje je jako część standardowej inicjalizacji, ale inne pliki startowe mogą odczytać je w innej kolejności niż udokumentowana Sekwencja startowa Bash. Domyślna zawartość plików użytkownika root może również mieć problemy, jak również pliki szkieletu system dostarcza do nowych kont użytkowników po konfiguracji. Skrypty startowe uruchamiające System X window mogą również robić zaskakujące rzeczy ze skryptami startowymi Bash użytkownika, próbując skonfigurować zmienne środowiskowe użytkownika przed uruchomieniem menedżera okien. Problemy te często można rozwiązać za pomocą pliku ~/.xsession
lub ~/.xprofile
, aby odczytać plik ~/.profile
— który dostarcza zmiennych środowiskowych, które okna powłoki Bash powstały z menedżera okien, takich jak Xterm lub Gnome Terminal.
Przenośnośćedit
wywołanie Basha z opcją --posix
lub podanie set -o posix
w skrypcie powoduje, że Bash jest bardzo zgodny ze standardem POSIX 1003.2. Skrypty powłoki Bash przeznaczone do przenoszenia powinny uwzględniać przynajmniej standard powłoki POSIX. Niektóre funkcje bash nie znaleziono w POSIX są:
- niektóre rozszerzone opcje wywoływania
- rozszerzenie nawiasów
- tablice i tablice asocjacyjne
- podwójny nawias
]
Rozszerzona konstrukcja testowa i jej dopasowanie regex - konstrukcja arytmetyczno-ewaluacyjna z podwójnymi nawiasami (tylko
(( ... ))
;$(( ... ))
- niektóre operacje manipulacji łańcuchami w rozszerzaniu parametrów
-
lokalnydla zmiennych zakresowych
- zastępowanie procesów
- builtins specyficzne dla Basha
- Koprocesy
- $EPOCHSECONDS i $EPOCHREALTIME zmienne
jeśli jakiś fragment kodu używa takiej funkcji, nazywa się to „bashism”-problem dla przenośnego użytku. Debian ’ s checkbashisms
i Vidar Holen ’ s shellcheck
mogą być użyte do upewnienia się, że skrypt nie zawiera tych części. Lista różni się w zależności od rzeczywistej powłoki docelowej: Polityka Debiana zezwala na niektóre rozszerzenia w swoich skryptach (tak jak w dash
), podczas gdy skrypt zamierzający obsługiwać powłoki Bourne ’ a przed POSIXEM, takie jak configure
, są jeszcze bardziej ograniczone w funkcjach, z których mogą korzystać.
skróty Klawiaturoweedit
Bash używa readline do udostępniania skrótów klawiaturowych do edycji wiersza poleceń przy użyciu domyślnych wiązań klawiszy (Emacs). VI-wiązania można włączyć uruchamiając set -o vi
.
Zarządzanie Procesamiedit
powłoka Bash ma dwa tryby wykonywania poleceń: wsadowy i tryb współbieżny.
aby wykonać polecenia wsadowo (tzn. w kolejności) muszą być oddzielone znakiem”;”, lub w osobnych wierszach:
command1; command2
w tym przykładzie, po zakończeniu polecenia command1, wykonywane jest polecenie command2.
wykonanie polecenia w tle może nastąpić za pomocą (symbol &) na końcu polecenia wykonawczego, a proces będzie wykonywany w tle, zwracając natychmiast kontrolę do powłoki i umożliwiając dalsze wykonywanie poleceń.
command1 &
lub aby mieć jednoczesne wykonanie dwóch komend 1 i komend 2, muszą być wykonane w powłoce Bash w następujący sposób:
command1 & command2
w tym przypadku polecenie 1 jest wykonywane w tle& symbol, zwracając natychmiast kontrolę do powłoki wykonującej polecenie 2 Na Pierwszym Planie.
proces może być zatrzymany i kontrola zwrócona do bash przez wpisanie Ctrl+z, gdy proces jest uruchomiony na pierwszym planie.
listę wszystkich procesów, zarówno w tle, jak i zatrzymanych, można uzyskać, uruchamiającjobs
:
$ jobs- Running command1 &+ Stopped command2
na wyjściu liczba w nawiasach odnosi się do ID zadania. Znak plus oznacza domyślny proces dla bg
I fg
. Tekst „uruchomiony ” i” zatrzymany ” odnoszą się do stanu procesu. Ostatni łańcuch jest poleceniem, które rozpoczęło proces.
stan procesu może być zmieniany za pomocą różnych poleceń. Poleceniefg
przenosi proces na pierwszy plan, podczas gdybg
ustawia zatrzymany proces działający w tle. bg
I fg
może przyjąć identyfikator zadania jako pierwszy argument, aby określić proces, który ma działać. Bez niego, używają domyślnego procesu, identyfikowanego przez znak plus na wyjściu jobs
. Poleceniekill
może być użyte do przedwczesnego zakończenia procesu poprzez wysłanie do niego sygnału. Identyfikator zadania musi być podany po znaku procent:
kill %1
warunkowe wykonywanieedit
Bash dostarcza separatory poleceń „warunkowe wykonanie”, które uzależniają wykonanie polecenia od kodu wyjścia ustawionego przez polecenie precedensowe. Na przykład:
cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2
gdzie ./do_something jest wykonywane tylko wtedy, gdy polecenie cd (change directory) było „pomyślne” (zwracało status wyjścia równy zero), a polecenie echo byłoby wykonywane tylko wtedy, gdy cd lub ./ do_something polecenie zwraca „błąd” (niezerowy status wyjścia).
dla wszystkich poleceń status zakończenia jest zapisywany w zmiennej specjalnej $?
. Bash obsługuje równieżif ...; wtedy ...; else ...; fi
I case $zmienna w $wzorze)...;; $other_pattern)...;; esac
formy warunkowej oceny komend.
zgłaszanie Błędówedit
zewnętrzne polecenie o nazwie bashbug zgłasza błędy powłoki Bash. Gdy polecenie jest wywoływane, wyświetla domyślny edytor użytkownika z formularzem do wypełnienia. Formularz jest wysyłany do opiekunów Bash (lub opcjonalnie na inne adresy e-mail).
programowalne uzupełnianieedit
programowalne uzupełnianie Bash,complete
Icompgen
polecenia są dostępne od wersji beta 2.04 w 2000 roku. Funkcje te umożliwiają złożone inteligentne uzupełnianie, takie jak oferowanie opcji tab-complete dostępnych programów, a następnie, po wybraniu przez użytkownika opcji, która wymaga nazwy pliku jako następnego wejścia, tylko Automatyczne uzupełnianie ścieżek plików (a nie innych opcji) dla następnego tokena.
Leave a Reply