Что такое POSIX-совместимый режим в Linux?

Книга гласит:

В режиме POSIX-совместимого, bash будет эмулировать sh .

Что это значит? Что подразумевается под эмуляцией в простых терминах непрофессионала?

3
задан 2 May 2016 в 12:21

1 ответ

Это не вещь Linux, это - вещь удара. Bash является только одной из многих оболочек. Bash является "Границей, снова окружают", и был выпущен как замена исходной Оболочки Bourne, sh.

POSIX является рядом определения стандартов, как должны работать совместимые POSIX системы. Стандарт оболочки POSIX может быть найден здесь. Bash имеет много функций, не существующих в sh и не на самом деле POSIX совместимая оболочка.

Это то, почему --posix возможность предоставляется. Как объяснено в man bash (шахта акцента):

Если удар вызывается с именем sh, это пытается подражать поведению запуска исторических версий sh максимально тесно при приспосабливании стандарту POSIX также. При вызове как интерактивная оболочка входа в систему или неинтерактивная оболочка с - опция входа в систему она сначала пытается считать и выполнить команды от/etc/profile и ~/.profile в том порядке. - noprofile опция может использоваться для запрещения этого поведения. При вызове как интерактивная оболочка с именем sh удар ищет переменный ENV, разворачивает его значение, если это определяется и использует расширенное значение в качестве названия файла, чтобы читать и выполниться. Начиная с оболочки, вызванной, поскольку, sh не пытается считать и выполнить команды из любых других файлов запуска, - rcfile опция не имеет никакого эффекта. Неинтерактивная оболочка, вызванная с именем sh, не пытается считать любые другие файлы запуска. При вызове как sh удар переходит к posix режиму после того, как файлы запуска читаются.

Когда удар запускается в posix режиме, как с - posix параметр командной строки, он следует стандарту POSIX для файлов запуска. В этом режиме интерактивные оболочки разворачивают огибающую переменную, и команды читаются и выполняются из файла, имя которого является расширенным значением. Никакие другие файлы запуска не читаются.

Это означает это, если Вы работаете sh, или bash --posix, запустить интерактивную оболочку, Ваш ~/.bahsrc файл проигнорирован и, вместо этого, файл, сохраненный как $ENV (если таковые имеются), читается. Для иллюстрирования добавил я echo "read .bashrc" к моему ~/.bashrc:

$ bash
read .bashrc  ## message was printed, ~/.bashrc was read
$ sh
sh-4.3$       ## no message printed, ~/.bashrc was not read

Если я теперь установил $ENV:

$ export ENV="~/.bashrc"
$ sh
read .bashrc

ВАЖНОЕ ПРИМЕЧАНИЕ: Ubuntu приняла решение сделать /bin/sh synlink к /bin/dash. Тире является еще одной оболочкой и является на самом деле совместимым POSIX. Это означает, что для наблюдения поведения, которое я описал выше, необходимо использовать другое sh1. На Ubuntu необходимо создать названный файл sh это - символьная ссылка на /bin/bash:

$ ln -s /bin/bash ~/sh

Вам теперь назвали файл sh в Вашем корневом каталоге. Используйте это для демонстрации различий, которые я объяснил выше:

$ ls -l ~/sh
lrwxrwxrwx 1 terdon terdon 9 May  2 14:03 /home/terdon/sh -> /bin/bash
$ ~/sh
read .bashrc

1 На самом деле, поведение посмотрит, как будто это - то же, ~/.bashrc будет проигнорирован, но это просто потому что dash не bash и не имеет никакого бизнеса, читая определенное для удара ~/.bashrc так или иначе. Однако dash также игнорирует $ENV таким образом, необходимо использовать ссылку на /bin/bash видеть это.

8
ответ дан 2 May 2016 в 22:21
  • 1
    Работавший для меня. Этот ответ должен быть принят! – Vijay Chavda 15 September 2018 в 01:14

Другие вопросы по тегам:

Похожие вопросы: