В моем сценарии я запускаю vim следующим образом:
$EDITOR hello.c
Затем я выполняю его:
./script.sh hello.c <stdin >>stdout 2>>stderr; echo $? >>errcode
Кто-нибудь знает, почему вывод выглядит так:
[?1049h[?1h=[1;24r[?12;25h[?12l[?25h[27m[m[H[2J[?25l[24;1H"/home/sandbox/ios-15-1/desc1_file/xvysta02/hello.c" 6L, 77C[1;1H[35m#include [m[31m<stdio.h>[m
[32mint[m main()
{
printf([31m"Hello world[m[35m\n[m[31m"[m);
[33mreturn[m [31m0[m;
}
[1m[34m~ [8;1H~ [9;1H~ [10;1H~ [11;1H~ [12;1H~ [13;1H~ [14;1H~ [15;1H~ [16;1H~ [17;1H~ [18;1H~ [19;1H~ [20;1H~ [21;1H~ [22;1H~ [23;1H~ [m[24;63H1,1[11CAll[1;1H[?12l[?25h[24;1H[?1l>[?1049lVim: Error reading input, exiting...
Vim: Finished.
[24;1H
Вместо этого:
running editor with: /.sanitized./hello.c (hash da427fd)
Похоже, что он распечатывает содержимое файла hello.c
Это мой школьный проект, поэтому результат — тестовый сценарий.
2 ответа
Вы не можете запустить Vim в интерактивном режиме внутри скрипта с перенаправлением его вывода. Vim распечатывает различные Escape-последовательности ANSI для управления терминалом, и это то, что вы видите. Вы не упомянули, для чего используете Vim, поэтому вот общее введение в автоматизацию манипулирования текстом в скрипте:
Альтернативы
Если вам действительно не нужны специальные возможности Vim, вам, вероятно, лучше использовать неинтерактивные инструменты , такие как sed
, awk
или Perl / Python / Ruby / ваш здесь любимый скриптовый язык .
Тем не менее, вы можете использовать Vim неинтерактивно:
Тихий пакетный режим
Для очень простой обработки текста (т. Е. Использования Vim как расширенного 'sed' или 'awk', возможно, просто извлекая выгоду из расширенных регулярных выражений в команде :substitute
), используйте Ex-mode .
REM Windows
call vim -N -u NONE -n -i NONE -es -S "commands.ex" "filespec"
Примечание: пакетный режим без вывода сообщений (:help -s-ex
) приводит к сбоям в работе консоли Windows, поэтому вам, возможно, придется выполнить cls
для очистки после запуска Vim.
# Unix
vim -T dumb --noplugin -n -i NONE -es -S "commands.ex" "filespec"
Внимание: Vim зависнет в ожидании ввода, если файл "commands.ex"
не существует; лучше заранее проверьте его наличие! Кроме того, Vim может читать команды из stdin. Вы также можете заполнить новый буфер текстом, прочитанным из stdin, и прочитать команды из stderr, если вы используете аргумент -
.
Полная автоматизация
Для более продвинутой обработки с участием нескольких окон и реальной автоматизации Vim (где вы можете взаимодействовать с пользователем или оставить Vim запущенным, чтобы позволить пользователю взять на себя управление) используйте:
vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"
Вот краткое изложение используемых аргументов:
-T dumb Avoids errors in case the terminal detection goes wrong.
-N -u NONE Do not load vimrc and plugins, alternatively:
--noplugin Do not load plugins.
-n No swapfile.
-i NONE Ignore the |viminfo| file (to avoid disturbing the
user's settings).
-es Ex mode + silent batch mode -s-ex
Attention: Must be given in that order!
-S ... Source script.
-c 'set nomore' Suppress the more-prompt when the screen is filled
with messages or output to avoid blocking.
Vim использует управляющие символы для создания интерактивного экрана. Если вы хотите использовать vim с перенаправлением, попробуйте что-то вроде
vi hello.c >/dev/null 2>@1 <<end
:1,$ s/world/StackOverflow/
:wq
end
Строка с концом должна начинаться с первого столбца и без пробелов после него. Если вы хотите больше поиграть с этой конструкцией, вы можете перейти в режим вставки, введите что-нибудь и "нажмите клавишу выхода". Поместите escape-ключ, используя CTRL-V ESC
.
Похожие вопросы
Новые вопросы
macos
macOS (ранее известная как OS X или Mac OS X) - это операционная система для настольных ПК от Apple, установленная на компьютерах Macintosh. Используйте этот тег только в том случае, если ваш вопрос касается использования API-интерфейсов macOS или поведения, специфичного для macOS, а не потому, что вы запускаете свой код в macOS. Вопросы, связанные с использованием или устранением неполадок macOS, не относятся к теме и принадлежат сообществу «Спроси другое».