Подтвердить что ты не робот

Почему эта переменная оболочки неверно установлена

У меня есть конкретный пользователь на моей Linux-машине, с которым следующая команда

json='[{"date":"2016"}]' && echo ${json}

выводит 1, а не [{"date":"2016"}].

Со всеми другими пользователями на моей машине это работает правильно. Когда я меняю команду на (опуская 1)

json='[{"date":"206"}]' && echo ${json}

он работает правильно.

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

Какие-нибудь намеки?

4b9b3361

Ответ 1

Квадратные скобки создают выражение glob, соответствующее любому одному символу внутри них.

[123] соответствует файлу с именем 1, 2 или 3; аналогично, [{"date":"2016"}] соответствует файлам с именами d, a, t, e, :, 2, 0, 1, 6, ", { или }.

Вы не замечаете это для пользователей, у которых нет имени файла, так как поведение по умолчанию выражения glob без совпадений не оценивается для себя (хотя это значение по умолчанию может быть изменено с помощью shopt -s nullglob, в котором case glob без совпадений ничего не дает).

Процитировать расширение - echo "$json" - чтобы избежать этого.


Воспроизведение:

json='[{"date":"2016"}]'
owd=$PWD
tempdir=$(mktemp -d "${TMPDIR:-/tmp}/test.XXXXXX")
cd "$tempdir" && {
  touch 1
  echo "With the bug: "    $json
  echo "Without the bug: " "$json"
}

# cleanup
cd "$owd"
rm -rf "$tempdir"