无法从 perl 脚本运行“compgen -c”

noa*_*oah 1 bash perl command redhat

我想检查我的机器(RedHat)上的 perl 脚本中是否存在命令。

我试图检查是否compgen -c包含所需的命令,但从脚本内部运行它只会给我一个空的输出。其他命令工作正常。

示例.pl:

my $x = `compgen -c`;
print $x;
# empty output

my $y = `ls -a`;
print $y;
# .
# ..
# example.pl
Run Code Online (Sandbox Code Playgroud)

有可能的解决方案吗?或者有更好的方法来检查我的机器上的命令吗?

zdi*_*dim 6

首先,Perl 使用 运行外部命令/bin/sh,现在它是一个指向 shell 的链接,该 shell 是系统上的默认设置。大部分时间是这样bash,但并非总是如此;在 RedHat 上是这样。

\n

compgen是 bash 内置的。发现这一点的一种方法是运行man compgen(在 bash 中)——然后bash就会弹出手册。另一种方法type如戴夫所示。

\n

要使用内置函数,我们通常需要为它们运行一个显式 shell,并且它们对于 shell 是否是“交互式”有不同的行为。\xe2\x80\xa0我无法在这个内置函数的 bash 文档中找到对此的讨论,但实验表明你需要

\n
my @completions = qx(bash -c "compgen -c")\n
Run Code Online (Sandbox Code Playgroud)\n

需要使用引号才能将完整的命令传递到将启动的 shell。

\n

请注意,这样您就不会捕获STDERR这些命令中的任何内容。这将在终端上显示,这样就可能会被错过。或者,您可以通过在命令末尾添加2>&1(redirect to )来重定向命令中的流。STDOUT

\n

这是使用许多优秀库之一来运行和管理外部命令而不是内置“反引号”的原因之一(我上面使用的qx是它的运算符形式。)

\n
\n

\xe2\x80\xa0这可以通过-i

\n
my @output_lines = qx(bash -i -c "command with arguments")\n
Run Code Online (Sandbox Code Playgroud)\n