" Î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