Исторические сноски и тайны
Это приложение содержит исторические сноски, извлеченные откуда-либо в документе для улучшения удобочитаемости. Они появляются в этом приложении, потому что несмотря на то, что они могут иметь некоторый интерес, они не критически важны по отношению к общему пониманию предмета.
Исторический строковый парсинг
В некоторых ранних Совместимых с границей оболочках второй оператор ниже не делает то, что Вы могли бы первоначально подозревать:
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-х.