~ Поведение оператора glob с пустым шаблоном

Проблема заключается в этой строке:

if test -d $file

$file, который вы извлекли из ls -A, не содержит полного пути. Вы можете исправить это, заменив эту строку на

if test -d "$1/$file"

Есть еще один баг, который заключается в том, что он будет ломаться повсюду, если в имени файла есть пробелы. Заключите имена файлов в кавычки.

4
24.02.2017, 23:24
1 ответ

~~ не использует пустой шаблон. Вместо этого он выполняет одно из двух:

  • В конце всего шаблона буквально соответствует « ~~ ».
  • В середине буквально соответствует одиночному « ~ », затем переходит к следующему исключенному шаблону (т.е. литералу ~ , за которым следует ~ ] оператор).

Если мы расширим ваш набор файлов несколькими дополнениями, мы увидим, что это произошло:

touch file3~ file3~~ file4~ file4~~

Теперь выполняется ваша первая нечетная команда:

print -rl file*~f*3~~file4*
file1
file2
file3
file3~~

file3 ~ исключен, как и все три file4 * с. file3 ~~ все еще существует, потому что он не соответствует f * 3 ~ .

Второй:

print -rl file*~f*3~file4*~~
file1
file2
file3~
file3~~
file4
file45
file4~

Только file4 ~~ был исключен, потому что это единственный подходящий file4 * ~~ .

Последний случай теперь имеет вывод:

print -rl file*~~f*3~file4*
file3~
file3~~

, поскольку это два файла, соответствующие file * ~ , которые не соответствуют ни f * 3 , ни file4 * .

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

5
27.01.2020, 20:53

Теги

Похожие вопросы