Zastąpienie polecenia

W informatyce zastępowanie poleceń to funkcja, która umożliwia uruchomienie polecenia i wklejenie jego danych wyjściowych z powrotem do wiersza poleceń jako argumenty do innego polecenia. Podstawianie poleceń pojawiło się po raz pierwszy w powłoce Bourne'a , wprowadzonej wraz z wersją 7 systemu Unix w 1979 roku i pozostało cechą charakterystyczną wszystkich późniejszych powłok uniksowych . Od tego czasu funkcja ta została przyjęta również w innych językach programowania , w tym w Perlu , PHP , Ruby i Microsoft Powershell pod Windows . Pojawia się również w CMD.EXE firmy Microsoft w poleceniu FOR i poleceniu () .

Składnia i semantyka

Powłoki zwykle implementują zastępowanie poleceń, tworząc proces potomny, który uruchamia pierwsze polecenie ze standardowym wyjściem przesyłanym z powrotem do powłoki, która odczytuje to wyjście, analizując je na słowa oddzielone białymi znakami . Ponieważ powłoka nie może wiedzieć, że ma wszystkie dane wyjściowe dziecka, dopóki potok się nie zamknie lub dziecko nie umrze, czeka do tego czasu, zanim uruchomi kolejny proces potomny, aby wykonać drugie polecenie.

Ten przykład powłoki C pokazuje, jak można wyszukać wszystkie pliki C zawierające ciąg znaków malloc za pomocą fgrep , a następnie edytować znalezione pliki za pomocą edytora vi . Przedstawiona tutaj notacja składniowa, ` ... ` , z użyciem cudzysłowów jako ograniczników , jest oryginalnym stylem i jest obsługiwana przez wszystkie popularne powłoki systemu Unix.

 #!/bin/csh  vi  `  fgrep -l malloc *.c  ` 

Zgłoszono zastrzeżenia zarówno do składni , sposobu jej pisania, jak i semantyki , sposobu jej działania.

Chociaż łatwa do wpisania, co jest ważnym czynnikiem dla interaktywnego procesora poleceń, składnia była krytykowana jako niewygodna do zagnieżdżenia, polegająca na umieszczaniu jednego podstawienia polecenia w innym, ponieważ zarówno lewy, jak i prawy ogranicznik są takie same. KornShell (ksh) rozwiązał ten problem za pomocą alternatywnej notacji $( ... ) , zapożyczonej ze stylu notacji używanego do podstawienia zmiennych . Obecnie większość powłok systemu UNIX obsługuje tę składnię. PowerShell firmy Microsoft również używa tej notacji z tą samą semantyką.

 #!/bin/bash  vi  $(  fgrep -l malloc *.c  ) 

Krytykowano również semantykę, dzielącą dane wyjściowe na słowa w odstępach. Działało dobrze we wczesnych Unix , w których nazwy plików nigdy nie zawierały spacji, ale nie działa dobrze w nowoczesnych systemach Windows i Linux , w których nazwy plików z pewnością mogą zawierać spacje. W każdym z powyższych przykładów, jeśli którakolwiek z nazw plików pasujących do symbolu wieloznacznego *.c zawiera spację, ta nazwa pliku zostanie podzielona na dwa oddzielne argumenty dla vi , co wyraźnie nie było zamierzone. Powłoka Hamiltona C rozwiązała ten problem za pomocą podwójnego cudzysłowu wstecznego, `` ... `` , który rozkłada się na słowa tylko na końcach linii.

To jest przykład podstawiania poleceń za pomocą operatora () w PowerShell :

  
 $MojaZmienna  =  (  ls  )  echo  $MojaZmienna 

Zastąpienie wyrażenia

Pokrewną funkcję, zastępowanie wyrażeń, można znaleźć w językach Common Lisp i Scheme , wywoływanych za pomocą operatora przecinka w wyrażeniu oznaczonym operatorem backquote (lub „quasiquote”) oraz w ABC , za pomocą wyrażenia zawartego między cudzysłowy wewnątrz wyświetlacza tekstowego ( literał łańcuchowy ). Na przykład polecenie ABC WRITE '2 + 2 = `2+2`' daje wynik 2 + 2 = 4 .

Zobacz też