Вы не можете сделать это изнутри вашего скрипта. *
должен быть экранирован , в противном случае он попытается уместить имена файлов (в вашем случае x.
, затем что угодно, например *
оператор glob, который соответствует любой строке в имени файла). Вы можете сделать это в основном тремя способами - заключите строку в одинарные или двойные кавычки:
./script.sh "x.*"
./script.sh 'x.*'
Или префикс проблемного символа с обратной косой чертой:
./script.sh x.\*
Как Джефф упомянул в комментариях (спасибо), вы также можете отключить расширение глобуса с помощью :
set -o noglob
Вы можете снова включить его, установив + noglob
, если хотите.
Это потому, что :
входит в список символов, которые readline
рассматривают как разделители слов для завершения слов (, которые bash
отображаются в переменной оболочки $COMP_WORDBREAKS
).
После:
COMP_WORDBREAKS=${COMP_WORDBREAKS/:}
(чтобы убрать :
из $COMP_WORDBREAKS
), Ctrl + X*должно работать.
Кто-то может возразить, что :
не должен быть в этом списке в первую очередь именно по той причине, что он используется в классах символов, но я полагаю, причина в том, что вы хотите иметь возможность использовать завершение для таких вещей, как:
PATH=~/bin:/usr/locTab
И этот механизм слишком грубый (вы заметите, что Ctrl + X*на 'a'*
не работает, даже если вы удалите '
из $COMP_WORDBREAKS
), чтобы приспособить оба, так что это компромисс. См. zsh
, оболочку с гораздо более продвинутыми возможностями редактирования, которая здесь работает в обоих случаях.