Почему аргументы в фигурных скобках не расширяются в этом случае?

Существует также 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
5
15.11.2012, 13:12
2 ответа

Причина это не работает, состоит в том потому что bash выполняет расширение фигурной скобки перед заменой команды (Справочник Bash имеет некоторую информацию об этом). Замена не выполняется, пока расширение фигурной скобки уже не произошло.

Единственным путем Вы могли сделать, это при помощи eval, но не делайте этого в этом случае, поскольку Вы позволите произвольное выполнение команды.

Вместо этого необходимо искать некоторый другой метод. Это должно произвести вывод, который Вы ищете:

for file in *; do
    printf '%s ' "foo/bar/$file"
done; echo
7
27.01.2020, 20:36

С 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 в большинстве оболочек выполняет некоторые преобразования на аргументах, которые это получает, так лучше избегается для произвольного входа).

2
27.01.2020, 20:36

Теги

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