Как встроен развернуть шаблон шаблона, содержащий класс символов?

Вы не можете сделать это изнутри вашего скрипта. * должен быть экранирован , в противном случае он попытается уместить имена файлов (в вашем случае x. , затем что угодно, например * оператор glob, который соответствует любой строке в имени файла). Вы можете сделать это в основном тремя способами - заключите строку в одинарные или двойные кавычки:

./script.sh "x.*"
./script.sh 'x.*'

Или префикс проблемного символа с обратной косой чертой:

./script.sh x.\*

Как Джефф упомянул в комментариях (спасибо), вы также можете отключить расширение глобуса с помощью :

set -o noglob

Вы можете снова включить его, установив + noglob , если хотите.

1
03.11.2018, 12:50
1 ответ

Это потому, что :входит в список символов, которые readlineрассматривают как разделители слов для завершения слов (, которые bashотображаются в переменной оболочки $COMP_WORDBREAKS).

После:

COMP_WORDBREAKS=${COMP_WORDBREAKS/:}

(чтобы убрать :из $COMP_WORDBREAKS), Ctrl + X*должно работать.

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

PATH=~/bin:/usr/locTab

И этот механизм слишком грубый (вы заметите, что Ctrl + X*на 'a'*не работает, даже если вы удалите 'из $COMP_WORDBREAKS), чтобы приспособить оба, так что это компромисс. См. zsh, оболочку с гораздо более продвинутыми возможностями редактирования, которая здесь работает в обоих случаях.

1
27.01.2020, 23:42

Теги

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