Wiele osób korzysta z onelinerów i skryptów zawierających kod wzdłuż linii
cat "$MYFILE" | command1 | command2 > "$OUTPUT"
Pierwszy cat
jest często nazywany „bezużytecznym użyciem kota”, ponieważ technicznie wymaga on rozpoczęcia nowego procesu (często /usr/bin/cat
), w którym można by tego uniknąć, gdyby polecenie było
< "$MYFILE" command1 | command2 > "$OUTPUT"
ponieważ wtedy powłoka musi się tylko uruchomić command1
i po prostu wskazać stdin
na podany plik.
Dlaczego powłoka nie wykonuje tej konwersji automatycznie? Uważam, że składnia „bezużyteczne korzystanie z kota” jest łatwiejsza do odczytania, a powłoka powinna mieć wystarczającą ilość informacji, aby automatycznie pozbyć się bezużytecznego kota. Jest cat
on zdefiniowany w standardzie POSIX, więc powłoka powinna mieć możliwość implementacji go wewnętrznie zamiast używania ścieżki binarnej. Powłoka może nawet zawierać implementację tylko dla jednej wersji argumentu i wrócić do ścieżki binarnej.
lseek
jest nadal zdefiniowanym zachowaniem i może powodować inny wynik, różne zachowanie blokujące może mieć znaczenie semantyczne itp. Dopuszczalne byłoby dokonanie zmiany, gdybyś wiedział, jakie były inne polecenia i wiedziałeś, że ich to nie obchodzi, lub jeśli po prostu nie dbałeś o kompatybilność na tym poziomie, ale korzyść jest niewielka. Wyobrażam sobie, że brak korzyści napędza sytuację bardziej niż koszt zgodności.
cat
lub użyć dowolnego innego narzędzia. Dozwolone jest również wiedzieć, jak działają inne narzędzia należące do systemu (np. Może wiedzieć, jak zachowuje się zewnętrzna grep
implementacja dostarczona z systemem ). Jest to całkowicie wykonalne, więc można się zastanawiać, dlaczego tak nie jest.
grep
. I sed
… I awk
… I du
… A ile setek, jeśli nie tysiące innych narzędzi?