检查文件是否是可执行的perl

时间:2018-03-23 05:10:32

标签: perl file

我有一个程序可以检查我目录中的文件是否可读,可写和可执行。

我设置它看起来像

if (-e $file){  
print "exists";  
}  

if (-x $file){  
print "executable";  
}  

等等

但我的问题是当我运行它时,它表明文本文件也是可执行的。纯文本文件,其中包含1个单词。我觉得有一个错误。我做错了什么。我是一个完整的perl noob,原谅我。

2 个答案:

答案 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脚本与您正在检查的目录相同(这将导致不合需要的脚本行为)。

希望它有所帮助;)