Co oznacza przekierowanie „<<(…)”?


32

Widziałem, że rvm (menedżer wersji Ruby) jest instalowany za pomocą następującego polecenia:

bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )

Tak więc, jak rozumiem, otrzymujemy treść skryptu i przekazujemy go bashowi (wierzę < <i czy <<to to samo?) Interesuje mnie ta < <część, która zawiera następujący opis w sieci:

<< token Oznacza, że ​​bieżący strumień wejściowy jest używany jako STDIN dla programu, dopóki token nie zostanie wyświetlony.

Nie jest to dla mnie jasne, czy ktoś może dać przykład lub wyjaśnić go w prostszy sposób?

Odpowiedzi:


40

Nie, < <i <<to nie to samo.

Pierwszy składa się ze wspólnego <znaku przekierowania połączonego z pierwszym znakiem <(command)składni. Jest to kshkonstrukcja ( znana również w bashi zsh) znana jako podstawienie procesu, która pobiera dane wyjściowe commandi udostępnia je w pliku, którego nazwa odnosi się do drugiego końca potoku, commanddo którego pisze.

Innymi słowy można myśleć < <(command)jak < file, gdzie plik zawiera wyjście command.


5
Dowiedziałem się o tym poleceniu kilka dni temu, jest to bardzo przydatne polecenie. Rzeczy, które możesz z tym zrobić, są ograniczone tylko twoją wyobraźnią: np. To polecenie daje ci listę tylko ukrytych plików:diff <(ls) <(ls -a)
Khaja Minhajuddin

1
Ta składnia może być naprawdę przydatna, ale w szczególnym przypadku Stoneraina nie wydaje się, aby zapewniała jakąkolwiek wartość dodaną w porównaniu do zwykłego potoku.
jlliagre

1
W powyższej składni to nie pomaga. Ale jeśli zmienisz go nieco, będzie znacznie lepiej: bash <(curl ...)zamiast bash < <(curl ...)nie kraść STDIN, więc możesz swobodnie odpowiadać na pytania i wprowadzać dane do skryptu.
tylerl

Używanie <() wydaje się być doskonałą alternatywą dla wysyłania wielu zmiennych $ bezpośrednio do poleceń, zamiast konieczności niepotrzebnego zapisywania zmiennych $ najpierw do plików. diff <(echo „$ text1”) <(echo „$ text2”) stackoverflow.com/questions/13437104/…
Sepero,

18

Jest to skomplikowany sposób na prostsze:

curl -s https://raw.github.com/... | bash
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.