Spec-Zone.ru › Bash

Режим POSIX в Bash

Запуск Bash с опцией командной строки --posix или выполнение команды ‘set -o posix’ во время работы Bash приведет к тому, что Bash будет соответствовать стандарту POSIX более точно, изменив поведение для соответствия указанному в POSIX в тех областях, где поведение по умолчанию Bash отличается.

При вызове как sh, Bash переходит в режим POSIX после чтения стартовых файлов.

Ниже приведен список изменений, когда включен режим POSIX:

  1. Bash гарантирует, что переменная POSIXLY_CORRECT установлена.
  2. Когда команда в таблице хешей больше не существует, Bash повторно ищет $PATH, чтобы найти новое местоположение. Это также доступно с помощью ‘shopt -s checkhash’.
  3. Bash не будет вставлять команду без установленного бита выполнения в таблицу хешей команд, даже если она возвращает ее в качестве (последнего) результата поиска $PATH.
  4. Сообщение, выводимое кодом управления заданиями и встроенными командами, когда задание завершается с ненулевым статусом, — это ‘Done(status)’.
  5. Сообщение, выводимое кодом управления заданиями и встроенными командами, когда задание приостановлено, — это ‘Stopped(signame)’, где signame — это, например, SIGTSTP.
  6. Расширение псевдонимов всегда включено, даже в неинтерактивных оболочках.
  7. Зарезервированные слова, появляющиеся в контексте, где распознаются зарезервированные слова, не подвергаются расширению псевдонимов.
  8. Расширение псевдонимов выполняется при первоначальном разборе подстановки команды. По умолчанию режим в основном откладывает его, когда он включен, до выполнения подстановки команды. Это означает, что подстановка команды не будет расширять псевдонимы, которые определены после того, как подстановка команды была первоначально обработана (например, в рамках определения функции).
  9. POSIX расширения ‘!’ до номера истории и ‘!!’ до ‘!’ включены, а расширение параметров выполняется по значениям PS1 и PS2 независимо от настройки параметра promptvars.
  10. Файлы запуска POSIX выполняются ($ENV) вместо обычных файлов Bash.
  11. Расширение тильды выполняется только для присваиваний, предшествующих имени команды, а не для всех операторов присваивания в строке.
  12. Файл истории по умолчанию — ~/.sh_history (это значение по умолчанию для $HISTFILE).
  13. Операторы перенаправления не выполняют расширение имен файлов для слова в перенаправлении, если оболочка не интерактивна.
  14. Операторы перенаправления не выполняют разделение слов для слова в перенаправлении.
  15. Имена функций должны быть допустимыми именами оболочки name. То есть они не могут содержать символы, отличные от букв, цифр и символов подчеркивания, и не могут начинаться с цифры. Объявление функции с недопустимым именем приводит к фатальной синтаксической ошибке в неинтерактивных оболочках.
  16. Имена функций не могут совпадать с одним из специальных встроенных команд POSIX.
  17. Специальные встроенные команды POSIX находятся перед функциями оболочки во время поиска команды.
  18. При выводе определений функций оболочки (например, с помощью type), Bash не выводит ключевое слово function.
  19. Буквальные тильды, которые появляются в качестве первого символа в элементах переменной PATH, не расширяются, как описано выше в разделе Расширение тильды.
  20. Зарезервированное слово time может использоваться само по себе как команда. При использовании таким образом оно отображает статистику времени выполнения оболочки и ее завершенных дочерних процессов. Переменная TIMEFORMAT управляет форматом временной информации.
  21. При разборе и расширении расширения ${…}, которое появляется в двойных кавычках, одинарные кавычки больше не являются специальными и не могут использоваться для заключения в кавычки закрывающей фигурной скобки или другого специального символа, если оператор не является одним из тех, которые определены для удаления шаблонов. В этом случае они не должны появляться в виде пар.
  22. Парсер не распознает time как зарезервированное слово, если следующий токен начинается с ‘-’.
  23. Символ ‘!’ не вводит расширение истории внутри строки в двойных кавычках, даже если опция histexpand включена.
  24. Если специальная встроенная команда POSIX возвращает код ошибки, неинтерактивная оболочка завершается. Фатальные ошибки — те, которые перечислены в стандарте POSIX, и включают такие вещи, как передача неправильных параметров, ошибки перенаправления, ошибки присваивания переменных для присваиваний, предшествующих имени команды, и так далее.
  25. Неинтерактивная оболочка завершается с кодом ошибки, если возникает ошибка присваивания переменной, когда имя команды не следует за операторами присваивания. Ошибка присваивания переменной возникает, например, при попытке присвоить значение переменной только для чтения.
  26. Неинтерактивная оболочка завершается с кодом ошибки, если возникает ошибка присваивания переменной в операторе присваивания, предшествующем специальной встроенной команде POSIX, но не с любой другой простой командой. Для любой другой простой команды оболочка прерывает выполнение этой команды, и выполнение продолжается на верхнем уровне («оболочка не должна выполнять дальнейшей обработки команды, в которой произошла ошибка»).
  27. Неинтерактивная оболочка завершается с кодом ошибки, если переменная итерации в операторе for или переменная выбора в операторе select является переменной только для чтения.
  28. Неинтерактивные оболочки завершаются, если filename в . filename не найден.
  29. Неинтерактивные оболочки завершаются, если синтаксическая ошибка в арифметическом расширении приводит к недопустимому выражению.
  30. Неинтерактивные оболочки завершаются, если возникает ошибка при расширении параметров.
  31. Неинтерактивные оболочки завершаются, если возникает синтаксическая ошибка в скрипте, прочитанном с помощью встроенных команд . или source, или в строке, обработанной встроенной командой eval.
  32. Хотя косвенное обращение к переменным доступно, оно не может применяться к специальным параметрам ‘#’ и ‘?’.
  33. Расширение специального параметра ‘*’ в контексте шаблона, где расширение заключено в двойные кавычки, не обрабатывает $* как если бы оно было заключено в двойные кавычки.
  34. Операторы присваивания, предшествующие специальным встроенным командам POSIX, сохраняются в среде оболочки после завершения встроенной команды.
  35. Встроенная команда command не предотвращает встроенные команды, которые принимают операторы присваивания в качестве аргументов, от расширения их как операторов присваивания; когда не в режиме POSIX, встроенные команды присваивания теряют свои свойства расширения операторов присваивания, когда предшествуют command.
  36. Встроенная команда bg использует требуемый формат для описания каждого задания, помещенного в фоновом режиме, который не включает указание того, является ли задание текущим или предыдущим.
  37. Вывод ‘kill -l’ печатает все имена сигналов в одной строке, разделенные пробелами, без префикса ‘SIG’.
  38. Встроенная команда kill не принимает имена сигналов с префиксом ‘SIG’.
  39. Встроенные команды export и readonly отображают свой вывод в формате, требуемом POSIX.
  40. Встроенная команда trap отображает имена сигналов без ведущего префикса SIG.
  41. Встроенная команда trap не проверяет первый аргумент на возможное указание сигнала и не возвращает обработку сигнала к исходному состоянию, если это так, за исключением случаев, когда этот аргумент состоит только из цифр и является допустимым номером сигнала. Если пользователи хотят сбросить обработчик для данного сигнала до исходного состояния, они должны использовать ‘-’ в качестве первого аргумента.
  42. trap -p отображает сигналы, состояние обработки которых установлено в SIG_DFL, и те, которые были проигнорированы при запуске оболочки.
  43. Встроенные команды . и source не ищут файл в текущей директории, если он не найден при поиске в PATH.
  44. Включение режима POSIX имеет эффект установки опции inherit_errexit, поэтому дочерние оболочки, запущенные для выполнения подстановок команд, наследуют значение опции -e от родительской оболочки. Когда опция inherit_errexit не включена, Bash очищает опцию -e в таких дочерних оболочках.
  45. Включение режима POSIX имеет эффект установки опции shift_verbose, поэтому числовые аргументы для shift, превышающие количество позиционных параметров, приведут к сообщению об ошибке.
  46. Когда встроенная команда alias выводит определения псевдонимов, она не отображает их с ведущим ‘alias ’, если не указан параметр -p.
  47. Когда встроенная команда set вызывается без параметров, она не отображает имена и определения функций оболочки.
  48. Когда встроенная команда set вызывается без параметров, она отображает значения переменных без кавычек, если они не содержат метасимволы оболочки, даже если результат содержит непечатаемые символы.
  49. Когда встроенная команда cd вызывается в логическом режиме, и путь, построенный из $PWD и имени каталога, предоставленного в качестве аргумента, не ссылается на существующий каталог, cd завершится ошибкой вместо перехода к физическому режиму.
  50. Когда встроенная команда cd не может изменить директорию, потому что длина пути, построенного из $PWD и имени каталога, предоставленного в качестве аргумента, превышает PATH_MAX при расширении всех символических ссылок, cd завершится ошибкой вместо попытки использовать только предоставленное имя каталога.
  51. Встроенная команда pwd проверяет, что выводимое значение совпадает с текущей директорией, даже если ей не задано проверять файловую систему с опцией -P.
  52. При отображении истории встроенная команда fc не включает указание того, была ли запись истории изменена.
  53. Редактор по умолчанию, используемый fc, — ed.
  54. Встроенные команды type и command не будут сообщать о том, что невыполнимый файл найден, хотя оболочка попытается выполнить такой файл, если это единственный файл с таким именем, найденный в $PATH.
  55. Режим редактирования vi будет вызывать редактор vi напрямую при выполнении команды ‘v’ вместо проверки $VISUAL и $EDITOR.
  56. Когда опция xpg_echo включена, Bash не пытается интерпретировать какие-либо аргументы для echo как опции. Каждый аргумент отображается после преобразования управляющих символов.
  57. Встроенная команда ulimit использует размер блока 512 байт для опций -c и -f.
  58. Появление SIGCHLD при установке ловушки на SIGCHLD не прерывает встроенную команду wait и не заставляет ее возвращаться немедленно. Команда ловушки выполняется один раз для каждого дочернего процесса, который завершается.
  59. Встроенную команду read можно прервать сигналом, для которого установлена ловушка. Если Bash получает пойманный сигнал во время выполнения read, обработчик ловушки выполняется, и read возвращает код выхода больше 128.
  60. Встроенная команда printf использует double (через strtod) для преобразования аргументов, соответствующих спецификаторам с плавающей точкой, вместо long double, если оно доступно. Модификатор длины ‘L’ принудительно заставляет printf использовать long double, если оно доступно.
  61. Bash удаляет статус завершенного фонового процесса из списка таких статусов после использования встроенной команды wait для его получения.

Существует другое поведение POSIX, которое Bash не реализует по умолчанию, даже когда включен режим POSIX. В частности:

  1. Встроенные проверки fc проверяют $EDITOR как программу для редактирования записей истории, если FCEDIT не задано, вместо непосредственного использования значения по умолчанию ed. fc использует ed если EDITOR не задано.
  2. Как указано выше, Bash требует включения опции xpg_echo для того, чтобы встроенная команда echo соответствовала стандарту.

Bash можно настроить на соответствие POSIX-стандарту по умолчанию, указав --enable-strict-posix-default при компиляции configure (см. Дополнительные возможности).

Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API