【问题标题】:How do I exit the vi session which runs during Perl script execution?如何退出在 Perl 脚本执行期间运行的 vi 会话?
【发布时间】:2012-02-20 09:31:21
【问题描述】:

我必须做一些工作。运行每个作业后,它会在内容上运行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);
}

【问题讨论】:

  • 如果 vi 编辑器应该在没有人工干预的情况下完成,你为什么还要打开它?知道了这一点,我们可以看看如何解决这个问题。
  • “当我运行脚本时” -> 如果我们不知道它是什么,我们怎么知道它有什么问题?
  • 实际上我们并没有打开vi编辑器,工作会自动打开vi编辑器,以防我们需要编辑任何数据(主要是需要更新的日期),保存后将相同的数据加载到db table.. 我实际上是在调用保存在数组中的每个作业,然后一个接一个地运行它们。
  • 您是否尝试过管道文件句柄让程序说 /dev/null ? cr_job $job_name[$i] $job_rc 1>/dev/null 2>/dev/null 我猜 vi 正在为你“打开”,因为“cr_job”的输出告诉你的终端这样做。跨度>
  • 我检查了它,但它绕过了终端,因此数据库没有得到更新。正如我之前提到的,一旦我们关闭终端,它将更新数据库中的这些数据,我们无法修改客户端提供的序列

标签: perl system exec vi interactive


【解决方案1】:

我认为你从错误的角度处理问题。与其退出vi,不如考虑不运行它。

我只能猜测为什么vi 运行,它似乎与你的“工作”有关。可能的原因之一是他们运行默认的文本编辑器来获取一些用户输入(这种行为的众所周知的例子是,当您在不提供消息的情况下调用 hg commitsvn commitcvs ci 等时,他们自动运行文本编辑器以获取提交消息)。

如果是这种情况,请首先检查您的“工作”,因为他们可能会选择禁用此提示。如果没有,他们可能会使用$EDITOR 环境变量来决定运行哪个编辑器,将此变量设置为您准备的内容(例如,将默认消息写入作为参数的文件的脚本)可能会这样做。

【讨论】:

  • 我们正在运行客户给我们的作业,我们无法修改。因此,根据我的说法,除了退出 vi 之外别无他法。
猜你喜欢
  • 2013-01-21
  • 1970-01-01
  • 2019-06-02
  • 2013-12-09
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多