Солярис 10 / бин / ш вилки по косвенности - PullRequest
4 голосов
/ 15 июля 2010

Я заметил, что оболочка Bourne в Solaris 10 /bin/sh (а также /sbin/sh) разветвляется при использовании косвенного обращения (<).Я пробовал кучу других оболочек Борна, в том числе:

  • Оболочка POSIX /usr/xpg4/bin/sh на Solaris 10
  • /bin/bash, /bin/ksh на Solaris 10
  • /bin/sh в AIX 5
  • /bin/sh в Debian Linux 5

, и ни один из них не демонстрирует такого поведения.

Я пораженЯ не был укушен этим раньше.Например, в оболочках saner (т. Е. Во всех перечисленных выше) следующий скрипт выводит «1»:

$ cat foo
#!/bin/sh
x=0
while read y ; do
  x=1
done </etc/passwd
echo $x
$ ./foo
0
$

Solaris 10 /bin/sh возвращает 0, потому что назначение x=1 происходит в подоболочке, вызваннойкосвенность: при выходе из подоболочки это назначение теряется.(Если я удаляю </etc/passwd и читаю из stdin, вместо этого выводится «1», как и ожидалось).

Есть ли какая-то давняя причина, по которой «традиционный» Solaris sh обладает этим свойством?Или это ошибка?

Ответы [ 2 ]

1 голос
/ 15 июля 2010

Я бы сказал, что это является нарушением стандарта POSIX.

Подстановка команд, команды, сгруппированные в скобках, и асинхронные списки должны выполняться в среде подоболочек.Кроме того, каждая команда многокомпонентного конвейера находится в среде подоболочек;однако в качестве расширения любая или все команды в конвейере могут выполняться в текущей среде. Все остальные команды должны выполняться в текущей среде оболочки.

Источник: Язык команд оболочки , раздел 2.12.

1 голос
/ 15 июля 2010

Оболочка Bourne делает это - создает дочерний процесс - для циклов и других конструкций.Это ожидаемое поведение.Это не ошибка в том смысле, что любой, кто его использует, «знает», что эта проблема существует.Иногда это ошибочное предположение.

НЕ разрабатывать в Bourne, за исключением системных (например, запуска / выключения) сценариев в Solaris.Используйте вместо этого оболочку POSIX: ksh, bash.Оболочкой по умолчанию для root должна быть оболочка Bourne, в противном случае система не сможет загрузиться.Это артефакт старой Системы V.

Такой же тип предостережения существует для кодирования в csh.Он также не готов к прайм-тайм.

...