2013-10-08 2 views
1

Можно ли использовать UTF-8, а не только 7-битное подмножество ASCII, в современных интерпретаторах Bourne Shell, будь то в комментариях (например, с использованием символов рисования) или передача аргументов функции или программы? Я рассматриваю, могут ли файловые системы безопасно обрабатывать Unicode в именах путей вне сферы действия этого вопроса.Unicode в Bourne Shell исходный код

Я знаю, по крайней мере, чтобы не помещать спецификацию в мои сценарии оболочки ... когда-либо, так как это нарушит синтаксический анализ строки ядра.

+1

Технически, нет современной оболочки Бурна. 'sh' - это оболочка POSIX, которая в значительной степени основана на' ksh', которая, в свою очередь, была под влиянием, но значительно расширяет оболочку Bourne. – chepner

+0

Да, я должен был сказать * POSIX * shell. Хорошая точка зрения. Как уже было сказано, слишком поздно менять, учитывая различия между ними. – pilona

+0

Это второстепенный момент; данные ответы по-прежнему применимы. – chepner

ответ

3

Дело в UTF-8 заключается в том, что любой старый код, который просто передает строковые данные и использует условное выражение строки строки завершающих строк с нулевым байтом, отлично работает. Это обычно характеризует, как оболочка обрабатывает имена и аргументы команд.

Даже если оболочка выполняет некоторую строчную обработку со специальными значениями для символов ascii, UTF-8 по-прежнему в основном работает нормально, потому что символы ascii кодируют точно так же в UTF-8. Так, например, оболочка все равно сможет распознавать все свои ключевые слова и синтаксические символы, такие как []{}()<>/.?;'"$&* и т. Д. Это характеризует, как, например, обрабатывать строковые литералы и другие биты синтаксиса скрипта.

Вы должны иметь возможность использовать UTF-8 в комментариях, строковых литералах, именах команд и аргументах команды. (конечно, система должна будет поддерживать имена файлов UTF-8, чтобы иметь команды UTF-8, а командам придется обрабатывать аргументы командной строки UTF-8.)

Возможно, вы не сможете использовать UTF-8 в именах функций или переменных, так как оболочка может искать строки символов ascii. Хотя если ваш язык UTF-8, то интерпретатор, который использует функции классификации символов на основе языка, может работать с идентификаторами UTF-8, но, вероятно, он не переносится.

2

Это действительно зависит от того, что вы пытаетесь сделать ... В общем, обычные ванильные производные от Bourne не могут обрабатывать символы Unicode внутри сценариев, что означает, что ваш текст скрипта должен быть чисто 8-битным ASCII (+), если вы заботитесь о переносимости. В то же время трубы полностью кодируют нейтраль, поэтому вы можете иметь такие вещи, как a | b, где a выходы UTF-8 и b принимает его. Таким образом, если find способен обрабатывать пути UTF-8, и ваш инструмент обработки для них может работать с строками UTF-8, вы должны быть в порядке.

+0

Чтобы добавить к этому, единственная проблема с использованием UTF-8 в оболочке, о которой я знаю, находится в идентификаторах ('foö = 5' не работает в' bash', по крайней мере). – chepner

+0

Идентификаторы Я не слишком беспокоился об идентификаторах (особенно в качестве англоязычного), и я знал о том, что каналы являются сырыми потоками данных, но я беспокоился, например, для комментариев. – pilona

+0

Если бы вы ранее написали файл Bj \ xF4rn - и если вы этого не сделали, многие из нас на протяжении десятилетий переименовывают его в Bj \ xC3 \ xB4rn, не растягивая вещи намного дальше. – tripleee

0

Поддержка нескольких байт была добавлена ​​в 1989 году в Bourne Shell, и, учитывая, что UNICODE был представлен в 1992 году, вы не можете ожидать UTF-8 от оболочки, которая старше UNICODE. SunOS представила поддержку UNICODE, когда она стала доступной.

Таким образом, любая оболочка Bourne, полученная из оболочки SVr4 Bourne Shell и скомпилированная и связанная с современной библиотечной средой, должна поддерживать UTF-8 в сценариях.

Если вы хотите, чтобы убедиться, что вы можете получить портативную версию с OpenSolaris Bourne Shell в Шили-инструментов: http://sourceforge.net/projects/schilytools/files/

osh оригинальный Bourne Shell сделал портативный только.

sh - это Bourne Shell с современными усовершенствованиями.

Смежные вопросы