gpt4 book ai didi

linux - 使用 konsole 通过 Perl 模拟终端

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:59 26 4
gpt4 key购买 nike

我在使用这个命令时遇到问题

system("konsole --new-tab --workdir<dir here> -e perlprogram.pl &");

它打开 perlprogram.pl,其中有:

system("mpg321 song.mp3");

我想这样做是因为 mpg321 暂停了主要的 perl 脚本。所以我想通过在另一个终端窗口中打开它就可以了。但是当我运行第一个脚本时,它所做的只是打开一个新选项卡,什么都不做。

我是否正确使用了 konsole?

最佳答案

Am I using konsole correctly?

很可能,没有。但这取决于。这个问题可以分解成两个问题:

  1. 我如何实现并发,以便我的程序在执行外部命令时不会停止
  2. 如何使用 konsole

1。并发

有多种方法可以做到这一点。从 fork||exec('new-program') 开始,到 system 'new-program &',甚至 open

system 将调用操作系统的标准 shell,并执行您提供的命令。如果您提供多个参数,则不会进行 shell 转义,而是直接执行指定的程序。 (到目前为止,exec 函数具有相同的界面)。 system 返回一个数字,指定命令是否正确运行:

system("my-command", "arg1") == 0
or die "failed my-command: $?";

请参阅 perlfunc -f system 了解有关此返回值含义的完整信息……

如果成功,exec 永远不会返回,而是将您的进程变形为执行新程序。

fork 将您的进程一分为二,并以相等的副本执行子进程和进程。它们fork的返回值上不同:父进程获取子进程的PID; child 得到零。因此,以下异步执行命令,并让您的主脚本执行而不会进一步延迟。

my @command = ("mpg321", "song.mp3");
fork or do {
# here we are in the child
local $SIG{CHLD} = 'IGNORE'; # don't pester us with zombies
# set up environment, especially: silence the child. Skip if program is well-behaved.
open STDIN, "<", "/dev/null" or die "Can't redirect STDIN";
open STDOUT, ">", "/dev/null" or die "Can't redirect STDOUT";
exec {$command[0]} @command;
# won't ever be executed on success
die qq[Couldn't execute "@command"];
};

上述过程有效地守护了 child (在没有 tty 的情况下运行)。

2。控制台

那个程序的命令行界面很糟糕,当我用任何参数运行它时,它有一半的时间会产生错误。

但是,您的命令(加上工作目录)实际上应该有效。结尾的 & 号不是必需的,因为 konsole 命令会立即返回。有点像

# because I `say` hello, I can be certain that this actually does something.
konsole --workdir ~/wherever/ --new-tab -e perl -E 'say "hello"; <>'

对我来说工作正常(打开一个新标签,显示“你好”,并在我按下回车键时关闭)。那里的最后一条阅读线使选项卡保持打开状态,直到我将其关闭。您可以在通过 --hold 执行 -e 命令之前将选项卡保持打开状态。这使您可以看到任何否则会消失的错误消息。

关于linux - 使用 konsole 通过 Perl 模拟终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14695147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com