Существует также unix-filename-rubout
для Readline
!
# in ~/.inputrc
# press ctrl-b to delete unix filename parts
# see: man bash | less -p 'unix-filename-rubout' and
# http://www.calmar.ws/vim/vi-bash.html
set editing-mode vi
set keymap vi
"\C-b": unix-filename-rubout
Причина это не работает, состоит в том потому что bash
выполняет расширение фигурной скобки перед заменой команды (Справочник Bash имеет некоторую информацию об этом). Замена не выполняется, пока расширение фигурной скобки уже не произошло.
Единственным путем Вы могли сделать, это при помощи eval
, но не делайте этого в этом случае, поскольку Вы позволите произвольное выполнение команды.
Вместо этого необходимо искать некоторый другой метод. Это должно произвести вывод, который Вы ищете:
for file in *; do
printf '%s ' "foo/bar/$file"
done; echo
С zsh:
files=(*)
echo foo/bar/$^l
(${^array}
включает расширение стиля расширения фигурной скобки для массива).
Или:
echo ./*(:s:.:foo/bar:)
Применяет замену стиля расширения истории к расширению имени файла.
С любой оболочкой
printf 'foo/bar/%s\n' *
Или:
set -- *
for i do
set -- "$@" "foo/bar/$i"
shift
done
echo "$@"
(отметьте это echo
в большинстве оболочек выполняет некоторые преобразования на аргументах, которые это получает, так лучше избегается для произвольного входа).