/bin/sh оценивает строку, а Bash — нет

«Использовать диск Super Grub»https://www.supergrubdisk.org/

Надеюсь, я помог.

1
24.02.2021, 22:22
1 ответ

Вы выявили интересную проблему...

Проблема заключается в отсутствии совместимости с POSIX в dash.

POSIX различает базовый уровень совместимости POSIX для крошечных встроенных систем и более крупных систем (, таких как, например. Linux ), заявленная совместимость с UNIX. В последнем случае в системе должны быть реализованы все так называемые расширения XSI.

Система, совместимая с XSI, должна была бы расширить некоторые символы обратной косой черты в аргументах echo.

bashможет быть скомпилирован для соответствия POSIX/XSI (, и это, например. сделано в Solaris и MacOS ), но не для бинарного файла bashв Linux. Если bashскомпилирован для совместимости с POSIX/XSI, он правильно обрабатывает экранирование обратной косой черты для аргументов echo, и ваш пример кода будет работать с таким двоичным файлом bashиз Solaris или MacOS,потому что в вашем примере кода нет управляющей последовательности POSIX/XSI.

Поскольку bashв Linux не совместим с XSI, он вообще не расширяет переходы обратной реакции для аргументов echo, поэтому код вашего примера работает с bashи в Linux.

dash, с другой стороны, заявляет о соответствии POSIX/XSI и расширяет символы обратной косой черты для аргументов echo. Если dashправильно реализует соответствие POSIX/XSI, код вашего примера также работает с dash. Это связано с тем, что код вашего примера не содержит escape-последовательности обратной косой черты POSIX/XSI.

POSIX/XSI требует echoдля расширения:

\0nnn  for an octal number that represents the related character

Ваш пример кода содержит последовательности обратной косой черты:

\1 for the first sed subexpression

и

\2 for the second sed subexpression

, и это не является частью управляющих последовательностей POSIX/XSI echo, поэтому встроенная функция echoиз оболочки, совместимой с POSIX, не может их расширять. Однако dashневерно расширяет \1и \2как восьмеричные числа, даже несмотря на то, что это запрещено POSIX. Вот почему ваш пример кода не работает с dash.

Я рекомендую вам сделать отчет об ошибке -относительно dashи либо дождаться исправления, либо заменить echo argна printf '%s\n' arg. Это работает даже с dash, потому что известная ошибка встроенной функции printfв dashне влияет на ваш случай.

Итак, мы можем перечислить ошибки POSIX/XSI из dashкак:

  • не поддерживает многобайтовые символы -.

  • расширяет \nnnв echoаргументах, хотя это запрещено

  • не расширяет \nnnв аргументах printf, хотя это и требуется.

0
18.03.2021, 22:28

Теги

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