我在我的机器上遇到了空间问题,因此unix中的sort命令因为/ tmp中缺少空间而失败。为了避免这种情况,我决定使用-T选项运行sort,允许它使用其他目录来创建临时文件。这是我的perl脚本
my $TMPDIR = "/home/xyz/workspace/";
my $sortCommand = "awk 'NR == 1; NR > 1 { print \$0 | \"sort -T \$TMPDIR -k1,1\" }' test > test.sort";
system_call($sortCommand, "Sort");
sub system_call {
.......
}
这在我的桌面上完美运行,但是当我在另一台机器上运行时,我收到了错误
“sort:无法创建临时文件:-k1,1 / sortFoeXZx:没有这样的文件或目录”
有什么想法吗?
答案 0 :(得分:2)
你在这里有四个级别的解释(perl,shell,awk,shell)。 sort shell命令是
awk 'NR == 1; NR > 1 { print $0 | "sort -T $TMPDIR -k1,1" }' test > test.sort
所以$TMPDIR
由内壳扩展。显然,桌面计算机上存在该名称的环境变量,但在其他计算机中则没有。最好的解决方法是使TMPDIR
成为一个环境变量并正确引用它(如果它的值包含必须受到awk或shell扩展保护的字符,那么从Perl扩展它会导致麻烦。)
$ENV{TMPDIR} = "/home/xyz/workspace/";
my $sortCommand = "awk 'NR == 1; NR > 1 { print \$0 | \"sort -T \\\"\$TMPDIR\\\" -k1,1\" }' test > test.sort";
很依赖Perl程序中的外部工具很奇怪。好的,如果sort
溢出/tmp
,那么Perl的内置sort
可能会耗尽内存。因此,请使用Sort::External。
答案 1 :(得分:0)
您已在$
变量之前转义TMPDIR
,导致$TMPDIR
传递给shell。由于这未在您的环境中定义,因此命令最终如下:
sort -T \ -k1,1
这无意中转义了以下空格字符,从而导致错误。
答案 2 :(得分:0)
FWIW,您可以使用File::Tempdir创建一些代码,无论您的环境如何,都可以使用相应的用户权限创建临时目录或文件。
use File::Temp 'tempdir';
my $tempdir = tempdir(CLEANUP => 1);
my $sortCommand = "awk 'NR == 1; NR > 1 { print \$0 | \"sort -T $tempdir -k1,1\" }' test > test.sort";
system_call($sortCommand, "Sort");