если односимвольное имя файла существует в строке, заключенной в [], вся строка заменяется символом - PullRequest
0 голосов
/ 01 мая 2020

Я делал одноразовый скрипт, называя его просто a, и я получил очень удивительную ошибку; скрипт содержал несколько ipv6-адресов в квадратных скобках, в том числе букву a.

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

Попробуйте этот код в bash, sh или csh

mkdir /tmp/temp123
cd /tmp/temp123
echo [123abc]
touch a
echo [123abc]

Вывод

[123abc]
a

Мой вывод таков:

  • ЕСЛИ файл с односимвольным именем файла существует в текущем каталоге

  • И этот символ находится где-нибудь между []

  • И есть пробелы снаружи [] (x [abc] y не работает)

, то оболочка заменяет всю подстроку, включая [].

Двух- (или более?) - имена файлов символов не влияют на это.

WTF?!?

1 Ответ

2 голосов
/ 01 мая 2020

Это не ошибка.

Символы в квадратных скобках являются частью сопоставления глобуса . Попробуйте:

cd /
echo [abcd]*

И если нет файлов, соответствующих данной маске, маска будет напечатана как есть.

Так что вам нужно заключить в кавычки ваши значения:

mkdir /tmp/temp123
cd /tmp/temp123
echo "[123abc]"
touch a
echo "[123abc]"
...