Исторические сноски и тайны

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

Исторический строковый парсинг

В некоторых ранних Совместимых с границей оболочках второй оператор ниже не делает то, что Вы могли бы первоначально подозревать:

STRING1="This is a test"
STRING2=$STRING1

Самые современные Оболочки Bourne анализируют правую сторону оператора присваивания сначала (включая любое разделение на пробелах), затем разворачивают переменную $STRING1, таким образом копируя полное значение STRING1 в STRING2.

Некоторые более старые оболочки, однако, могут сделать пространство, разделяющее после расширения переменной. Такие оболочки интерпретируют второй оператор, как будто Вы ввели следующее:

STRING2=This is a test

как оператор с двумя частями: оператор присваивания (FIRST_ARGUMENT=This) сопровождаемый командой (is) с двумя параметрами (a и test).

Поскольку нет никакой точки с запятой между присвоением и командой, оболочка обрабатывает этот оператор присваивания, поскольку попытка изменить среду передала is команда (метод описал в Переопределении Переменных окружения для Дочерних процессов (Оболочка Bourne)). Это ясно не, что Вы намеревались сделать.

Для максимальной совместимости необходимо всегда писать такие операторы присваивания как это:

STRING1="This is a test"
STRING2="$STRING1"

В любой Оболочке Bourne это интерпретируется правильно как:

STRING2="This is a test"

Точно так же в современных оболочках, кавычки и другие специальные символы анализируются перед расширением. Таким образом кавычки в переменной не влияют на поведение разделения. Например:

FOO="\"this is\" a test"
ls $FOO

эквивалентно:

ls \"this
ls is\"
ls a
ls test

В более старых Оболочках Bourne, однако, это может быть неправильно истолковано как:

ls "this is"
ls a
ls test

В целом это не стоит усилия поддерживать оболочки с этим поврежденным поведением разделения, и маловероятно, что Вы встретитесь с ними; современное поведение разделения было распространено с середины 1990-х.