Perl 的 -i
开关似乎修改只读文件:
$ echo 'foobar' > tmp.txt
$ chmod -w tmp.txt
$ perl -pi -w -e 's/foobar/FOOBAR/' tmp.txt
$ cat tmp.txt
FOOBAR
这是出乎意料的,因为该命令不应该能够根据其权限修改文件。预计,尝试通过其他方式更新它失败:
$ echo 'barbaz' > tmp.txt
-bash: tmp.txt: Permission denied
为什么 Perl 修改只读文件(以及如何修改?),最重要的是:我怎样才能让 Perl 不这样做?
我能在这方面找到的唯一信息丰富的资源是在 Perl FAQ 中。 :
The permissions on a file say what can happen to the data in that file. … If you try to write to the file, the permissions of the file govern whether you're allowed to.
最终似乎它说它不应该写入它,因为文件系统说你不能。
最佳答案
过滤器 @ARGV
在 BEGIN
块:
perl -pi -e 'BEGIN{@ARGV=grep{-w $_}@ARGV} s/foobar/FOOBAR/' files
现在,如果命令行上的文件都不可写,
@ARGV
将是空的,ARGV
文件句柄将尝试从 STDIN
读取.我可以想到两种方法来防止这成为问题:STDIN
在 BEGIN
也堵perl -pi -e 'BEGIN{close STDIN;@ARGV=grep{-w $_}@ARGV}s/foobar/FOOBAR/' files
/dev/null
调用此单行重定向输入perl -pi -e 'BEGIN{@ARGV=grep{-w $_}@ARGV}s/foobar/FOOBAR/' files < /dev/null
关于perl - 如何忽略带有 `perl -i` 的只读文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15791611/