IFS null - це не те саме, що не встановити IFS?


13

Я прочитав чудове запитання на тему " Розуміння ІФС" . Я був здивований, тому що відповіді та коментарі цитують POSIX, який стверджує, що IFS = не є тим самим, що не встановлює IFS. Якщо ви скасуєте IFS, мабуть, використовується значення за замовчуванням. Якщо замість цього зробити IFS нульовим, спліттера немає. Я знав, що бачив по-іншому, і знайшов це у своїх закладках:

Програмування Борна Шелла

$ IFS

Першим твердженням у вашому сценарії має бути

IFS =

який скидає роздільник поля введення до його значення за замовчуванням. В іншому випадку ви успадковуєте $ IFS від користувача, який, можливо, встановив його на якесь химерне значення, щоб зробити рядки sh розбору різними, ніж очікуєте, та викликати дивну поведінку.

Так це було правдою деякий час тому чи автор просто помиляється?

Відповіді:


20

Відповіді, які ви знайшли на Stack Exchange, правильні, і цей підручник невірний. Ви можете експериментувати самостійно або шукати це в стандарті . Скидання IFSеквівалентно встановленню його за замовчуванням пробілу-вкладки-нового рядка, тоді як порожній IFSефективно вимикає поділ поля.

Ви можете ознайомитися на сторінці Sven Mascheck на IFS про історичні втілення. Кілька історичних оболонок не сподобалися unset IFS, і дуже стара версія ksh трактувала це як порожній, IFSале всі сучасні оболонки та більшість старих оболонок трапляють незрівнянно, IFSяк значення за замовчуванням.

Не слід починати свій сценарій, IFS=якщо ви не хочете вимкнути розділення поля (що може бути розумним рішенням, - але зауважте, що вам все-таки потрібно поставити подвійні лапки навколо підстановок, щоб уникнути глобалізації, якщо ви також не вимкнете це set -f). Щоб скинути значення за замовчуванням, використовуйте unset IFS. Дискусійно, чи корисно це на початку сценарію; Є багато інших поганих речей, таких як хитрість, PATHяку абонент може зробити, щоб ваш сценарій пішов не так.

Цей підручник також радить скинути PATH. Зазвичай це погані поради. У більшості випадків ви не можете передбачити, який правильний шлях пошуку, але користувач знає. Звідки ви знаєте, містять /usr/local/binчи /home/bob/binмістять виправлені помилки версії утиліт у стародавньому unix, де ті, що /usr/binє, баггі? Ви дійсно хочете вкласти всю логіку, щоб зрозуміти, чи потрібно /usr/xpg6/binвипереджати /bin? В яку позицію ви хочете /usr/gnu/bin? Не скидайте PATH, якщо ваш сценарій не націлений на певну систему.

Я не читав цей підручник, але я перевірив одне: це не говорить вам з самого початку, щоб завжди ставити подвійні лапки навколо змінних підстановок і підстановок команд. Тому я не думаю, що цей підручник є гарним.


unset IFSне скидає IFS до значень за замовчуванням у bash, хоча він скидає поділ поля.
Мелаб

@Melab unset IFSне скидає IFSйого за замовчуванням, він скасовує його. Але скидання IFSмає той самий ефект, що і IFSвстановлене за замовчуванням.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.