我有一个程序可以检查我目录中的文件是否可读,可写和可执行。
我设置它看起来像
if (-e $file){
print "exists";
}
if (-x $file){
print "executable";
}
等等
但我的问题是当我运行它时,它表明文本文件也是可执行的。纯文本文件,其中包含1个单词。我觉得有一个错误。我做错了什么。我是一个完整的perl noob,原谅我。
答案 0 :(得分:2)
文本文件很可能是可执行的。在许多情况下它可能不是特别有用,但它肯定是可能的。
在Unix中(并且您的Mac运行的是类Unix操作系统),“可执行”设置只是在文件的目录条目中设置的标志。可以为任何文件设置或关闭该标志。
实际上有三种权限可以记录您是否可以读取,写入或执行文件。您可以在终端窗口中使用ls -l
命令查看这些权限(有关各种ls
选项的含义的更多详细信息,请参阅man ls)。有可能在Finder中查看这些权限的方法(可能是“属性”菜单项或类似的东西 - 我没有方便检查的Mac)。
您可以使用chmod
(“更改模式”)命令更改这些权限。有关详细信息,请参阅man chmod。
有关Unix文件模式的更多信息,请参阅this Wikipedia article。
但是文件是否可执行与其内容完全无关。
答案 1 :(得分:-1)
语句if (-x $file)
不检查文件是否是可执行文件,但是如果您的用户具有执行权限。
为了检查文件是否可执行,我很害怕没有一种神奇的方法。您可以尝试使用:
if (-T $file)
用于检查文件是否包含ASCII或UTF-8 enconding。if (-B $file)
用于检查文件是否为二进制文件。
如果这不适合您的情况,请考虑以下事项:
假设您使用的是Linux环境,请注意每个文件都可以执行。这里的问题是:执行例如:test.txt
,将引发标准错误(STDERR)?
很有可能,它会。
如果test.txt
文件包含:
Some text
您在Perl脚本中通过以下方式启动它:system("./test.txt");
这将显示如下的STDERR:
./test.txt: line 1: Some: command not found
如果由于某种原因你想要运行目录的所有文件(例如在for循环中)被警告这是非常危险的,因为你将启动所有文件而你可能不愿意这样做。特别是如果perl脚本与您正在检查的目录相同(这将导致不合需要的脚本行为)。
希望它有所帮助;)