В моем сценарии я запускаю 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

Это мой школьный проект, поэтому результат — тестовый сценарий.

0
DRINK 12 Апр 2015 в 19:18
Почему вы перенаправляете ввод и вывод vim? Vim — интерактивная программа, она очень хочет быть подключенной к живому терминалу.
 – 
John Kugelman
12 Апр 2015 в 19:26
Как я уже сказал, это школьный проект, и перенаправление в файл является частью тестирования - тогда они могут сделать разницу между моим выводом и выводом ref
 – 
DRINK
12 Апр 2015 в 19:36

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.
1
Ingo Karkat 12 Апр 2015 в 20:31

Vim использует управляющие символы для создания интерактивного экрана. Если вы хотите использовать vim с перенаправлением, попробуйте что-то вроде

vi hello.c >/dev/null 2>@1 <<end
:1,$ s/world/StackOverflow/
:wq
end

Строка с концом должна начинаться с первого столбца и без пробелов после него. Если вы хотите больше поиграть с этой конструкцией, вы можете перейти в режим вставки, введите что-нибудь и "нажмите клавишу выхода". Поместите escape-ключ, используя CTRL-V ESC.

0
Walter A 12 Апр 2015 в 20:08