Вы можете очень хорошо использовать echo
для этой цели.
$ cat new
echo 1
$ number=$(./new)
$ echo $number
1
Я думаю, что это служит цели. Также обратите внимание, что новый
выше - это сценарий, который вы собираетесь написать.
прокомментируйте ниже, если я что-то неправильно предположил
Вы должны либо использовать две обратные косые черты, либо использовать одинарные кавычки:
execute "! printf '=\\%.0s' {1..10}"
execute '! printf "=\%.0s" {1..10}'
Это необходимо, потому что при разборе строк в двойных кавычках("..."
)vim удалит все символы обратной косой черты, которые не начинают escape-последовательности, о которых он знает (, например. \n
или \x0a
), поэтому строка, передаваемая команде execute
, в конечном итоге будет ! printf '=%.0s' {1..10}
, а %
будет заменена текущим именем файла.
Как уже правильно ответили другие, %
необходимо экранировать, чтобы Vim не заменял его текущим именем файла (в соответствии с :help cmdline-special
), а внутри строки с двойными кавычками -обратную косую черту нужно удвоить.
Тем не менее, Vim предлагает:help shellescape()
функцию, которая делает всю работу за вас (и учитывает все специальные символы!):
execute "! printf ". shellescape("=%.0s",1). " {1..10}"
Здесь вам нужно экранировать каждый аргумент отдельно ; для голого printf
в этом нет необходимости, и {1..10}
не нужно заключать в кавычки в оболочке, чтобы его можно было расширить.
Обратите внимание, что нет необходимости раскошелиться только на printf
; В Vim встроеноprintf()
-дюймов
Поскольку непонятно, что вы пытаетесь сделать:
Заполнить текущую строку =
до столбца 80
map _= :execute 'normal A'. repeat("=", (80-col("$")+1))<cr>
Подчеркнуть текущую строку:
map _= :co.<cr>Vr=
Добавить разделитель (80 символов)
map _= :call append(line('.'), repeat("=", 80))<cr>