sort "$f1"
kończy się niepowodzeniem dla wartości $f1
rozpoczynających się od -
lub tutaj w przypadku sort
niektórych, które zaczynają się od +
(może mieć poważne konsekwencje dla pliku wywoływanego -o/etc/passwd
na przykład).
sort -- "$f1"
(gdzie --
sygnalizuje koniec opcji) rozwiązuje większość tych problemów, ale nadal nie działa w przypadku wywoływanego pliku -
(co sort
oznacza, że oznacza to jego standardowe wejście).
sort < "$f1"
Nie ma tych problemów.
Tutaj jest powłoka, która otwiera plik. Oznacza to również, że jeśli pliku nie można otworzyć, pojawi się również potencjalnie bardziej przydatny komunikat o błędzie (na przykład większość powłok wskaże numer wiersza w skrypcie), a komunikat o błędzie będzie spójny, jeśli użyjesz przekierowania, tam gdzie to możliwe, do otwierania plików.
I w
sort < "$f1" > out
(w przeciwieństwie do sort -- "$f1" > out
), jeśli "$f1"
nie można go otworzyć, out
nie zostanie utworzony / obcięty, a sort
nawet nie uruchomiony.
Aby usunąć pewne możliwe nieporozumienia (następujące komentarze poniżej), nie uniemożliwia to komendzie mmap()
wejścia do pliku lub lseek()
wejścia do niego (nie tylko sort
to), pod warunkiem, że sam plik jest widoczny. Jedyna różnica polega na tym, że plik jest otwierany wcześniej i na deskryptorze pliku 0 przez powłokę, w przeciwieństwie do późniejszej komendy na innym deskryptorze pliku. Polecenie może nadal szukać / mmap tego fd 0, jak mu się podoba. Nie należy tego mylić z cat file | cmd
tym, że tym razem cmd
stdin jest rurą, której nie można kształtować / szukać.