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

Книга говорит:

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

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

1 ответ

Решение

Это не вещь Linux, это вещь bash. Баш - это лишь одна из многих оболочек. Bash является "оболочкой Bourne again" и был выпущен в качестве замены оригинальной оболочки Bourne, sh,

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

Вот почему --posix опция предоставляется. Как объяснено в man bash (выделение мое):

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

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

Это означает, что если вы запустите 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 ссылка на /bin/dash, Dash - это еще одна оболочка, на самом деле POSIX-совместимая. Это означает, что для наблюдения за поведением, которое я описал выше, вам нужно использовать другое sh 1 В 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 и не имеет никакого смысла читать специфичные для bash ~/.bashrc тем не мение. Тем не мение, dash также игнорирует $ENV так что вам нужно использовать ссылку на /bin/bash чтобы увидеть это.

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