При задании filename
есть опечатка (дополнительное пространство): filename= test.txt
. Это выражение интерпретируется как , вызывающее команду test.txt
с переменной окружения filename
, которая установлена в пустую строку. Поэтому вы должны удалить пробел после =
.
Что касается чтения ошибки ввода сообщения, прочитайте документацию Vim: :help E208
:
Vim: Error reading input, exiting...
Это происходит, когда Vim не может читать вводимые символы в то время как требуется ввод. Вим застрял, единственное, что он может сделать, это выйти. Это может произойти, когда и stdin, и stderr перенаправляются и выполняются сценарий, который не выходит из Vim.
Так что Vim считает, что он читал сценарий, который не выходил из Вима. Ваш скрипт входит в режим вставки, вводит Hello
, затем Esc и, наконец, вызывает команду :x
. Все хорошо, и команда :x
выходит из Vim, если она введена в области командной строки, конечно. Если вы ввели ^[
в Control - V, Esc, сценарий бы вышел из режима вставки и успешно выполнил команду :x
. Поэтому вы ввели ^[
в виде двух символов.Таким образом, ваш реальный вклад был Hello^[:x
(и сценарий не вышел Vim):
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Теперь, если заменить два персонажей ^[
с фактическим экранирующим символом, и выполнить скрипт из того же каталога, что потерпит неудачу из-за файла подкачки:
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
(вы можете прочитать длинное описание, запустив vim test.txt
). Вы можете игнорировать файлы подкачки с опцией -n
: vim -n "$filename"
. Теперь выход будет:
Vim: Warning: Input is not from a terminal
Имеет смысл. Вам действительно не нужна интерактивная версия Vim. Таким образом, вы должны использовать ex mode (-e
), или, скорее, улучшенный ex-режим (-E
опция): vim -n -E "$filename"
.
Также рекомендуется обернуть значения в одинарных кавычках, если контент не предполагается интерпретировать, и в двойных кавычках, если строка содержит переменные оболочки: filename='test.txt'
.
Фиксированный версия:
filename='test.txt'
vim -n -E "$filename" << COMMAND
i
Hello
^[
:x
COMMAND
(^[
вводится в Vim с помощью управления - v, Esc).
Огромное вам спасибо, я вложу все это в голову: D –