Использование наборов символов с буквой «а» в них приводит к неожиданному поведению в определенных каталогах - PullRequest
1 голос
/ 14 мая 2019

У нас есть несколько сценариев, которые анализируют список строк, используя echo $VALUE | tr -d [:space:], которые прекрасно работали в своем исходном каталоге.Однако позже мы обнаружили, что существует другой каталог, в котором мы должны хранить эти сценарии, поэтому мы не задумывались и переместили их.Однако, переместив их, мы заметили, что наш вывод запутался, потому что пробелы больше не удалялись.Вместо этого был удален только символ «а».

После некоторых проб и ошибок мы обнаружили, что наборы символов, содержащие букву «а», такие как

[:alnum:]  
[:alpha:]  
[:blank:]  
[:graph:]
[:space:] 

, былипросто заменить на «а».Таким образом, запуск echo $VALUE | tr -d [:space:] на самом деле был просто удалением буквы «а».Пример: echo "t a r g e t" | tr -d [:space:] вернет t r g e t вместо target.Чтобы подтвердить это, я выполнил echo [:space:] в оболочке, и он просто вернул a.Как что-то подобное работает?Есть ли способ, которым я могу изменить это?

1 Ответ

4 голосов
/ 14 мая 2019

То, что вы описываете, происходит, если текущий каталог содержит файл с именем a.

Чтобы увидеть, что происходит, выполните следующие команды:

echo [:space:]
echo "[:space:]"
echo '[:space:]'

Если квадратные скобки не заключены в кавычки, они расширяются до списка файлов, которые им соответствуют. Выполните поиск «Оболочка файла оболочки», чтобы узнать обо всех правилах. В этом случае это будут следующие файлы:

:
s
p
a
c
e

Если в текущем каталоге существует только файл a, первая команда echo расширится до этого.

Когда вы создаете файлы p и e также в этом каталоге, первая команда echo выдаст a e p.

Вывод: всегда заключайте строки в кавычки при программировании в оболочке.

...