" Zastępowanie poleceń " to nazwa funkcji języka powłoki, która umożliwia wykonanie polecenia i zastąpienie wyniku tego polecenia ( podstawić) tekst polecenia.
Nie ma innej cechy języka powłoki, która na to pozwala.
Podstawienie polecenia, czyli cały $(...)
, jest zastępowane przez jego wyjście, które jest podstawowym zastosowaniem podstawień poleceń.
Polecenie, które wykonuje podstawianie poleceń, jest wykonywane w podpowłoka, co oznacza, że ma swoje własne środowisko, które nie będzie miało wpływu na środowisko powłoki nadrzędnej.
Nie wszystkie wykonania podpowłoki są substytucjami poleceń, chociaż ugh (zobacz dalsze przykłady na końcu).
Przykład pokazujący, że podstawianie poleceń jest wykonywane w podpowłoce:
$ s=123 $ echo "hello $( s=world; echo "$s" )" hello world $ echo "$s" 123
Tutaj, zmienna s
jest ustawiona na ciąg 123
. W następnym wierszu wywoływana jest echo
na łańcuchu zawierającym wynik podstawienia polecenia. Podstawienie polecenia ustawia s
na ciąg world
i odbija ten ciąg. Ciąg world
jest wynikiem polecenia podczas podstawiania polecenia , a zatem, jeśli został uruchomiony pod set -x
zobaczylibyśmy, że druga linia powyżej zostałaby rozwinięta do echo "hello world"
, co daje hello world
na terminalu:
$ set -x $ echo "hello $( s=world; echo "$s" )" ++ s=world ++ echo world + echo "hello world" hello world
(bash
dodaje dodatkowy poziom +
podpowiedzi na każdym poziomie podpowłoka podstawiania poleceń w danych wyjściowych śledzenia, inne powłoki mogą tego nie robić)
Na koniec pokazujemy, że polecenie wewnątrz podstawiania poleceń zostało uruchomione w jego własnej podpowłoce, ponieważ nie wpłynęło to na wartość s
w wywołującej powłoce (wartość s
to nadal 123
, a nie world
).
Istnieją inne sytuacje, w których polecenia są wykonywane w podpowłokach, na przykład w
echo "hello" | read message
W bash
, chyba że ustawisz opcję lastpipe
(tylko w instancjach nieinteraktywnych), read
jest wykonywane w podpowłoce, co oznacza że $message
nie zostanie zmieniony w powłoce nadrzędnej, tj. wykonanie echo "$message"
po powyższym poleceniu spowoduje wyświetlenie pustego ciągu (lub dowolnej wartości $message
było wcześniej).
Podstawienie procesu w bash
jest również wykonywane w podpowłoce:
cat < <( echo "hello world" )
To również różni się od podstawiania poleceń.
Komentarze