Как выйти из сеанса vi, который запускается во время выполнения Perl-скрипта?

Мне приходится работать на нескольких работах. После запуска каждого задания выполняется vi содержимое. После записи и выхода (обычно я делаю :wq!) эти данные обновляются в базе данных. Так как таких заданий больше сотни, я подумал автоматизировать процесс с помощью Perl.

Но когда я запустил скрипт, я застрял в vi, не в силах заставить его выйти самостоятельно. Это требует ручного вмешательства и не соответствует цели моего сценария. Мне нужна помощь в том, как справиться с такой ситуацией, так как это поможет мне сэкономить время и силы.

Код приведен ниже:

print "Enter job name - \n";
$job_rc = <>;
print "Job entered by you is $job_rc \n";
my @job_name = ("job1", "job2", "job3", "job4");
my $total_job = @job_name;
print "Total job present = $total_job + 1 \n";
for ($i = 0; $i < $total_job; $i++) {
    print "Curent job name: $job_name[$i] \n";
    system "cr_job $job_name[$i] $job_rc";
    sleep(10);
}

person PJ.    schedule 20.02.2012    source источник
comment
Зачем вообще открывать редактор vi, если это должно быть сделано без вмешательства человека? Зная это, мы можем посмотреть, как подойти к этой проблеме.   -  person Rohan Prabhu    schedule 20.02.2012
comment
когда я запустил скрипт -> Как мы узнаем, что с ним не так, если мы не знаем, что это такое?   -  person TLP    schedule 20.02.2012
comment
на самом деле мы не открываем редактор vi, задание автоматически открывает редактор vi в случае, если нам нужно отредактировать какие-либо данные (в основном дату, которую необходимо обновить), которые после сохранения загружают те же данные в таблицу БД. Я фактически звоню каждому задание, сохраненное в массиве, а затем запускающее их одно за другим.   -  person PJ.    schedule 20.02.2012
comment
Вы пытались передать дескрипторы файлов для программы, чтобы сказать /dev/null ? cr_job $job_name[$i] $job_rc 1›/dev/null 2›/dev/null Я предполагаю, что vi открывается для вас, потому что вывод cr_job говорит вашему терминалу сделать это.   -  person GoldenNewby    schedule 20.02.2012
comment
я проверил это, но он обходит терминал, в результате БД не обновляется. как я уже упоминал ранее, как только мы закроем терминал, он обновит эти данные в БД, и мы не сможем изменить последовательность, поскольку она была предоставлена ​​​​клиентом.   -  person PJ.    schedule 23.02.2012


Ответы (1)


Мне кажется, вы подходите к проблеме не с той стороны. Вместо выхода из vi подумайте о том, чтобы не запускать его.

Я могу только догадываться, почему работает vi, похоже, это связано с вашими «работами». Одна из возможных причин заключается в том, что они запускают текстовый редактор по умолчанию, чтобы получить некоторый пользовательский ввод (хорошо известный пример такого поведения: когда вы вызываете hg commit, svn commit, cvs ci и т. д. без предоставления сообщения, они автоматически запускают текстовый редактор для получить сообщение фиксации).

Если это так, сначала проверьте свои «работы», так как у них могут быть опции для отключения этой самой подсказки. Если нет, они могут использовать переменную среды $EDITOR, чтобы решить, какой редактор запустить, установив эту переменную в то, что вы подготовите (например, сценарий, который будет записывать сообщение по умолчанию в файл, указанный в качестве параметра).

person Mekk    schedule 20.02.2012
comment
мы выполняем задания, предоставленные нам клиентами, которые мы не можем изменить. из-за этого, по моему мнению, нет другого пути, кроме выхода из vi. - person PJ.; 20.02.2012