To nastrojową polecenia do generowania 10 znaków hasła na chybił trafił:Dlaczego ta rura jest zakończona?
cat /dev/urandom | base64 | head -c 10
Moje pytanie brzmi: cat /dev/urandom | base64
jest nieskończony strumień wyjściowy, który nie zatrzyma się samoczynnie. Ale dlaczego dołączenie head -c 10
powoduje zakończenie całej rury? Zakładam, że cat
, base64
i head
są 3 oddzielnymi procesami, w jaki sposób można je zakończyć?
Warto wspomnieć, że jedynym powodem, dla którego 'head' w ogóle dostaje jakiekolwiek dane wejściowe, jest to, że' base64' zapisuje dane wyjściowe po tym, jak otrzymuje pewną ilość danych wejściowych, tj. Gdy bufor jest pełny. Jeśli miałby czytać do EOF, byłby to czytanie na zawsze, a "głowa" nigdy by się nie rozbiła. Tak podobny rurociąg, jak 'cat/dev/urandom | suma head -c 10' zachowałoby się inaczej, ponieważ 'sum' czeka na EOF. –
s/dostaje błędy zapisu/odbiera SIGPIPE/ –
Komentarz Roba * jest * bardzo * istotny. Jeśli proces dziedziczy program obsługi SIGPIPE lub ignoruje SIGPIPE (np. Jeśli jest uruchamiany pod starszym modułem podprocesów interpretera starszych pythonów) i nie sprawdza błędów zapisu, nie zostanie zakończony. Występuje * ogromna * różnica między błędem zapisu i odbieraniem SIGPIPE, a programy, które ignorują oba problemy, są podatne na działanie w nieskończoność. –