【问题标题】:Run a shell command through Perl in a specific terminal在特定终端中通过 Perl 运行 shell 命令
【发布时间】:2013-09-28 23:48:16
【问题描述】:

首先,我对 Perl 很陌生,所以我可能会遗漏一些明显的东西。这不是典型的“我想通过 Perl 运行 shell 命令”问题。

我不想捕获所有的 shell 输出。我有一个可以智能地写入终端的程序/脚本。我没有写它,也不知道它是如何工作的,但它似乎在打印一些初始化后将视图移动到适当的位置,然后擦除以前的终端输出并覆盖它(更新),直到它最终完成。我想从我的 perl 脚本中调用它,而不是将所有内容打印到文件中以获取它,因为打印到文件并不能保持打印输出的智能。

我需要做的就是:

  1. 在我的 perl 脚本中打开一个 xterm
  2. 那个终端中进行系统调用
  3. 在我手动退出之前让该终端一直运行

我可以在 perl 中做到这一点吗?

谢谢。

【问题讨论】:

  • 从命令行,我会像 xterm -hold -e programname 一样打开它,我假设你可以从 perl 中做到这一点。

标签: linux perl shell command-line


【解决方案1】:

通过示例尝试这样做:

#!/usr/bin/env perl

use strict; use warnings;
use autodie;

open my $term, '| xterm -hold -e $(</dev/stdin)';
foreach my $dir (qw|/etc /usr /home|) {
    print $term "ls $dir\n"; # do anything else you'd like than "ls $dir" here
}
close $term;

【讨论】:

  • 这行得通,但它比 ajk 更直接的答案有什么优势吗?
  • 它使事情变得更简单,可以通过示例循环使用或多次重复使用。
  • 已添加foreach 示例:如您所见,调用$term 文件句柄就足够了,无需再次输入xterm ...
【解决方案2】:
system 'xterm', '-hold', '-e', $program;

$program 是您要运行的终端感知程序。

-hold 导致 xterm 在程序退出后保持打开状态,等待您手动关闭它。

-e 指定要运行的程序或命令行。它及其参数必须出现在 xterm 命令行的最后。

【讨论】:

  • 我想建议system("xterm", "-hold", "-e", $program)system "xterm -hold -e " . quotemeta($program);,这样恶意的$program 值就不会像$program="echo; rm -rf /" 这样搞砸了...
  • 同意,Mørch 先生。我只将$program 渲染为一个变量,以表明它应该被 Stuart 想要的任何东西替换,而不是考虑用户输入,但单独引用它们仍然是一种更好的做法。答案已编辑。
  • 请扩大差异。
  • Stuart,当整个命令行作为一个参数传递时(正如我最初的说法,"xterm -hold -e $program"),Perl 调用一个 shell 来处理命令。这意味着任何 shell 元字符都将被扩展,如果 $program 可能以某种方式由与运行 xterm 的用户不同的用户提供,这可能会很危险。在这种情况下,这有点不太可能,因为 OP 可能只是在文件的前面定义了$program。但将命令作为单独的参数(不调用 shell)传递给 system 仍然是一个好习惯,除非你真的需要 shell 解析。
猜你喜欢
  • 2015-06-23
  • 2013-04-16
  • 2020-09-07
  • 2017-01-25
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
相关资源
最近更新 更多