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