IFS null to nie to samo co rozbrojony IFS?


13

Przeczytałem tutaj świetne pytanie zatytułowane Zrozumienie IFS . Byłem zaskoczony, ponieważ odpowiedzi i komentarze cytują POSIX, który stwierdza, że ​​IFS = to nie to samo, co rozbrojenie IFS. Jeśli odłączysz IFS, najwyraźniej zostanie użyta wartość domyślna. Jeśli zamiast tego ustawisz IFS na zero, nie będzie rozdzielacza. Wiedziałem, że widziałem inne podejście do tego i znalazłem to w moich zakładkach:

Programowanie Bourne Shell

$ IFS

Pierwszym stwierdzeniem w twoim skrypcie powinno być

IFS =

co resetuje separator pól wejściowych do wartości domyślnej. W przeciwnym razie $ IFS odziedziczysz od użytkownika, który mógł ustawić dla niego jakąś dziwaczną wartość, aby shse analizować łańcuchy inaczej niż się spodziewasz i wywoływać dziwne zachowania.

Czy to prawda, jakiś czas temu, czy autor się myli?

Odpowiedzi:


20

Odpowiedzi znalezione na Stack Exchange są prawidłowe i ten samouczek jest nieprawidłowy. Możesz eksperymentować sam lub sprawdzić to w standardzie . Unset IFSodpowiada ustawieniu domyślnej wartości spacji-tab-nowej linii, a pusty IFSskutecznie wyłącza dzielenie pól.

Możesz zapoznać się ze stroną Svena Maschecka na IFS na temat historycznych wdrożeń. Kilka historycznych powłok nie podobało się unset IFS, a bardzo stara wersja ksh traktowała ją jak pustą, IFSale wszystkie współczesne powłoki i większość starych powłok traktuje zestaw IFSjako wartość domyślną.

Nie powinieneś uruchamiać skryptu, IFS=chyba że chcesz wyłączyć dzielenie pól (co może być rozsądną decyzją - pamiętaj jednak, że nadal musisz umieszczać podwójne cudzysłowy wokół podstawień, aby uniknąć globowania, chyba że też to wyłączysz set -f). Aby zresetować wartość domyślną, użyj unset IFS. Można dyskutować, czy jest to przydatne na początku skryptu; istnieje wiele innych złych rzeczy, takich jak podejrzany, PATHże osoba dzwoniąca może zrobić, aby skrypt nie działał poprawnie .

W tym samouczku zaleca się również resetowanie PATH. To zwykle zła rada. W większości przypadków nie można przewidzieć prawidłowej ścieżki wyszukiwania, ale użytkownik wie. Skąd wiesz, czy /usr/local/binlub /home/bob/binzawiera wersje Bug-ustalona mediów na starożytnych UNIX gdzie te w /usr/binto buggy? Czy naprawdę chcesz osadzić całą logikę, aby dowiedzieć się, czy /usr/xpg6/binwyprzedzić /bin? W jakiej pozycji chcesz /usr/gnu/bin? Nie resetuj zmiennej PATH, chyba że skrypt jest ukierunkowany na określony system.

Nie przeczytałem tego samouczka, ale sprawdziłem jedną rzecz: od samego początku nie mówi ci, aby zawsze wstawiać podwójne cudzysłowy wokół podstawień zmiennych i podstawień poleceń. Nie sądzę więc, aby ten samouczek był dobry.


unset IFSnie resetuje IFS do domyślnej wartości w bash, chociaż resetuje podział pola.
Melab

@Melab unset IFSnie resetuje się IFSdo wartości domyślnej, resetuje ją. Ale rozbrojenie IFSma taki sam efekt jak IFSustawienie na wartość domyślną.
Gilles „SO- przestań być zły”,
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.