Что такое 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
чтобы увидеть это.