" Înlocuirea comenzii " este numele caracteristicii limbajului shell care vă permite să executați o comandă și să înlocuiți ieșirea acelei comenzi ( substituie) textul comenzii.
Nu există nicio altă caracteristică a limbajului shell care să îți permită să faci asta.
O înlocuire a comenzii, adică întregul este înlocuită de ieșirea sa, care este utilizarea principală a substituțiilor de comandă.
Comanda pe care o execută substituția de comandă este executată într-un subshell, ceea ce înseamnă că are propriul său mediu care nu va afecta mediul shell-ului părinte.
Nu toate execuțiile subshell sunt substituiri de comandă ugh (a se vedea alte exemple la sfârșit).
Exemplu care arată că o înlocuire a comenzii este executată într-un subshell:
$ s=123 $ echo "hello $( s=world; echo "$s" )" hello world $ echo "$s" 123
Aici, variabila s
este setată la șirul 123
. Pe linia următoare, echo
este invocat pe un șir care conține rezultatul unei înlocuiri de comandă. Înlocuirea comenzii setează s
la șirul world
și repetă acest șir. Șirul world
este ieșirea comenzii în substituirea comenzii și astfel, dacă aceasta a fost rulată sub set -x
, am vedea că a doua linie de mai sus ar fi fost extinsă la echo "hello world"
, care produce hello world
pe terminal:
$ set -x $ echo "hello $( s=world; echo "$s" )" ++ s=world ++ echo world + echo "hello world" hello world
(bash
adaugă un nivel suplimentar de solicitări +
la fiecare nivel de o sub-shell de substituție de comandă în ieșirea de urmărire, alte shell-uri ar putea să nu facă acest lucru)
În cele din urmă, arătăm că comanda din interiorul substituției de comandă a fost rulată în propria sa sub-shell, deoarece nu a afectat valoarea s
în shell-ul apelant (valoarea s
este încă 123
, nu world
).
Există și alte situații în care comenzile sunt executate în sub-shell-uri, cum ar fi în
echo "hello" | read message
În bash
, cu excepția cazului în care setați opțiunea lastpipe
(numai în instanțe non-interactive), read
este executat într-un subshell, ceea ce înseamnă că $message
nu va fi modificat în shell-ul părinte, adică făcând echo "$message"
după comanda de mai sus va răsuna un șir gol (sau orice valoare $message
a fost înainte).
O substituție de proces în bash
se execută și într-un subshell:
cat < <( echo "hello world" )
Și acest lucru este diferit de o substituire a comenzii.
Comentarii