Jak nazywa się składnia bash „<(zawartość pliku)”?

25

Ta odpowiedź na Security StackExchange używa interesującej składni bash do wygenerowania pliku w wierszu:

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

Ten kawałek jest szczególnie interesujący:

<(openssl ecparam -name secp384r1)

Działa tylko:

echo <(openssl ecparam -name secp384r1)

Wracam /dev/fd/63

Wydaje się więc, że tworzy tymczasowy deskryptor pliku z zawartością pliku.

Jak to się nazywa?

mikemaccana
źródło
3
Zauważ, że wynikowy „plik” jest tak naprawdę nazwanym potokiem, a niektóre programy nie obsługują ich jako argumentów pliku. Przykład: git diff --no-index file1 <(cat file2)nie powiedzie się z: error: /dev/fd/63: unsupported file type. Możesz także sprawdzić, error: readlink("/dev/fd/63"): No such file or directoryczy implementacja tworzy dowiązanie symboliczne do potoku (z jakiegoś powodu pojawia się jako zepsute łącze).
Kelvin,

Odpowiedzi:

35

Nazywa się to podstawieniem procesu i jest cechą bash, zsh i ksh (i ewentualnie innych, nie wiem). To nie jest POSIX i nie należy go używać w przenośnym kodzie, ale jest bardzo przydatny.

Oto odpowiedni rozdział podręcznika bash:

3.5.6 Zastąpienie procesu

Podstawianie procesów jest obsługiwane w systemach obsługujących nazwane potoki (FIFO) lub metodę / dev / fd nazywania otwartych plików. Przybiera formę

  <(list) 

lub

  >(list) 

Lista procesów jest uruchamiana z wejściem lub wyjściem podłączonym do FIFO lub jakiegoś pliku w / dev / fd. W wyniku rozszerzenia nazwa tego pliku jest przekazywana jako argument do bieżącego polecenia. Jeśli używany jest formularz> (lista), zapis do pliku zapewni dane wejściowe dla listy. Jeśli używana jest forma <(lista), plik przekazany jako argument powinien zostać odczytany, aby uzyskać wynik listy. Zauważ, że pomiędzy <lub> a lewym nawiasiem nie może pojawić się spacja, w przeciwnym razie konstrukcja byłaby interpretowana jako przekierowanie.

Jeśli jest dostępna, podstawianie procesów odbywa się jednocześnie z rozszerzaniem parametrów i zmiennych, podstawianiem poleceń i rozszerzaniem arytmetycznym.

terdon
źródło