在过去的两周里,我一直在研究脚本,该脚本运行得很好。昨天突然停止了工作。
我正在使用代码mkdir -p $somepath
。它开始挂起,所以我插入了“或死”。然后我发现这个错误可能是由于我没有检查它是否已经存在,所以我将代码更改为
unless (-e $somepath) {system ("mkdir -p $somepath") or die "Couldn't make $somepath: $!"
};
注意:我也使用不带系统的perl mkdir进行了此操作,但是由于没有任何操作,我尝试了所有操作。
这是奇怪的部分。它实际上是在创建目录,然后死于错误
Couldn't make "insert path here": No such file or directory
因此,似乎它正在执行mkdir,检查它是否确实存在,然后死亡。我不知道为什么它开始这样做,因为我没有更改脚本的任何内容,并且昨天运行良好。如果忘记了任何信息,请告诉我。
编辑:我发现了我的问题。它与任何mkdir都绝对无关。由于某种原因,它来自启用一个选项,该选项允许用户提供路径而不是在代码中具有直接路径。肮脏的修复是暂时禁用该功能。所以问题甚至在我到达mkdir线之前就已经发生了。
答案 0 :(得分:4)
问题是您添加的... or die
。
system
成功返回0
(在布尔上下文中为假),因此只有die
成功时,您的代码才会mkdir
。
此外,如果$!
报告退出状态为非零,则system
不包含有意义的状态代码。整个No such file or directory
消息都是红色鲱鱼。
更好:
system(...) == 0
or die "mkdir -p $somepath returned $?";
使用单个参数调用system
会经过外壳程序,如果$somepath
包含例如空格,*
或其他特殊字符。
更好:
system('mkdir', '-p', '--', $somepath) == 0
or die "mkdir -p $somepath returned $?";
事先检查-e $somepath
没有意义; mkdir -p
会为您解决这个问题。
最后,您不需要运行单独的程序即可创建目录层次结构:
use File::Path qw(make_path);
make_path($somepath);