Проблема заключается в этой строке:
if test -d $file
$file
, который вы извлекли из ls -A
, не содержит полного пути. Вы можете исправить это, заменив эту строку на
if test -d "$1/$file"
Есть еще один баг, который заключается в том, что он будет ломаться повсюду, если в имени файла есть пробелы. Заключите имена файлов в кавычки.
~~
не использует пустой шаблон. Вместо этого он выполняет одно из двух:
~~
». ~
», затем переходит к следующему исключенному шаблону (т.е. литералу ~
, за которым следует ~
] оператор). Если мы расширим ваш набор файлов несколькими дополнениями, мы увидим, что это произошло:
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 *
.
Возможно, это может быть ошибка синтаксического анализа, по крайней мере, для случая «литерал-затем-оператор», но я не вижу применения для пустого шаблона исключения, поэтому я не уверен, что еще он должен делать.