Linux命令(cp、rm)不是在perl脚本中执行的。有些作品。但是没有返回任何错误

Linux命令(cp、rm)不是在perl脚本中执行的。有些作品。但是没有返回任何错误,linux,perl,command,cp,Linux,Perl,Command,Cp,我犯了一个很奇怪的错误 我运行一个执行linux命令的perl脚本。它们是这样执行的: my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1`; myLog("$err"); $err为空,这意味着命令没有返回并出错。(对吗?) 我尝试使用exec“”或system()执行linux命令,但没有成功。 我试图改变道路。一样 此外,我还尝试在新的perl脚本中只运行cp命令。它起作用了。 但不是在我的完整perl脚本中 在这个p

我犯了一个很奇怪的错误

我运行一个执行linux命令的perl脚本。它们是这样执行的:

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1`;
myLog("$err");
$err为空,这意味着命令没有返回并出错。(对吗?)

我尝试使用exec“”或system()执行linux命令,但没有成功。 我试图改变道路。一样

此外,我还尝试在新的perl脚本中只运行cp命令。它起作用了。 但不是在我的完整perl脚本中

在这个perl脚本中,有些命令正常工作,有些命令不正常

剧本昨天还在演,今天早上就不演了。在此期间没有进行任何更改

我尝试了很多东西,如果有人有想法,我会很高兴

编辑: 服务器有许多进程未终止。清洗这些设备解决了问题。
因此,这个问题与另一个应用程序有关,但多亏了您的评论,我将改进日志记录。

您是否使用反勾号?在cp命令中添加-v以查看STDOUT中的内容,并将STDERR重定向到STDOUT,并检查cmd exitcode而不是STDERR中的错误消息

在执行之后立即打印命令输出怎么样

my $err = `cp -rv $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`;
my $exitcode = $? >> 8;
warn "Output: $err\nexitcode: $exitcode\n";

最好使用qx。检查此项:

是否使用反勾号?在cp命令中添加-v以查看STDOUT中的内容,并将STDERR重定向到STDOUT,并检查cmd exitcode而不是STDERR中的错误消息

在执行之后立即打印命令输出怎么样

my $err = `cp -rv $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`;
my $exitcode = $? >> 8;
warn "Output: $err\nexitcode: $exitcode\n";

最好使用qx。检查此项:

小问题:您没有捕获STDERR,因此不会看到错误(您也没有检查
$?
返回代码)

你应该这样做

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`;
将STDERR重定向到STDOUT,或使用其中一个模块运行命令


大问题:

您不应该从存在Perl本机模块的Perl运行系统命令。在本例中:模块


您还可以从
文件::Copy
复制目录。小问题:您没有捕获STDERR,因此不会看到错误(您也没有检查
$?
返回代码)

你应该这样做

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`;
将STDERR重定向到STDOUT,或使用其中一个模块运行命令


大问题:

您不应该从存在Perl本机模块的Perl运行系统命令。在本例中:模块


您还可以从
File::Copy

复制目录。您可能还希望引用可能包含任何shell特殊字符(包括空格)的参数。由于shell将对给定给它的字符串进行分词,因此如果
$HTML
包含空格
cp
将得到比预期更多的参数。Perl对此有非常简单的机制:
\Q\E
。以下是您的操作方法:

my $err = `cp -r \Q$HTML\E \Q/tssobe/www/tstweb/$subpath/$HTMLDIR1\E 2>&1`;

除了字母数字以外的任何内容在传递给shell之前都将被反斜杠转义。无论这些变量中包含什么,您都将为
cp
提供2个参数。

您可能还希望引用可能包含任何shell特殊字符(包括空格)的参数。由于shell将对给定给它的字符串进行分词,因此如果
$HTML
包含空格
cp
将得到比预期更多的参数。Perl对此有非常简单的机制:
\Q\E
。以下是您的操作方法:

my $err = `cp -r \Q$HTML\E \Q/tssobe/www/tstweb/$subpath/$HTMLDIR1\E 2>&1`;

除了字母数字以外的任何内容在传递给shell之前都将被反斜杠转义。无论这些变量中包含什么,您都将为
cp
提供2个参数。

您缺少错误报告。添加
使用autodie qw(:全部)位于脚本顶部附近,当出现错误时,它将中止,并显示有用的错误消息。对
$HTML
$subpath
$HTMLDIR1
变量使用的输入要非常小心,如果其中任何一个变量允许通过,则说明您编写了一个不安全的工具。最好使用或类似的工具来完全避免使用shell。您缺少错误报告。添加
使用autodie qw(:全部)位于脚本顶部附近,当出现错误时,它将中止,并显示有用的错误消息。对
$HTML
$subpath
$HTMLDIR1
变量使用的输入要非常小心,如果其中任何一个变量允许通过,则说明您编写了一个不安全的工具。最好使用或类似的工具来完全避免使用shell。为什么您认为qx//会更好?为什么您认为qx//会更好?