Чи гарантує POSIX, що стандартні утиліти є у PATH?


11

У розділі "Пошук та виконання команд" специфікація POSIX говорить, що PATHвиконується пошук при пошуку утиліти, яку потрібно виконати (за деякими винятками). Чи згадується специфікація де-небудь, яка PATHбуде ініціалізована до значення, яке гарантує, що знайдеться всі стандартні утиліти?

Або мені потрібно зробити щось на кшталт наступного, щоб гарантувати, що я ніколи не отримаю помилку "команда не знайдена" при спробі запустити стандартну утиліту?

PATH=$(command -p sh -c 'printf %s "${PATH}"')

(див. специфікацію commandутиліти POSIX )

Відповіді:


13

Так і ні. У середовищі POSIX утиліти повинні діяти так, як описано в специфікації. На практиці це означає, що відповідні версії утиліт повинні бути присутніми в $PATH. Однак, запускаючи свою програму в сумісній з POSIX системі, ви можете запускати її в невідповідному середовищі. На практиці часто трапляється те, що ОС має застарілий режим і режим POSIX і за замовчуванням перебуває в застарілому режимі. Гірше, ніж пропущені деякі команди, у застарілому режимі, як правило, є несумісність, наприклад, варіанти з різним значенням.

Ви можете отримати товар за PATHдопомогою getconf. Звичайно, це хитро, оскільки getconfв оригіналі $PATHможе бути не правильним. Використання програми для команди показує спосіб це зробити:

command -p getconf PATH

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


Хе, я цього навіть не помічав getconf PATHу розділі використання додатків. Дякую!
Річард Хансен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.