我正在尝试将sed
脚本迁移到perl单行代码,因为perl支持非贪婪的正则表达式。我已经从 sed 中的非贪婪(不情愿(正则表达式匹配中获得了建议?以及为什么我的 Perl 就地脚本即使失败了,也会以零退出代码退出?
如果无法打开文件,我需要我的 oneliner 以非零状态退出。
不幸的是,检查-f $ARGV[0]
是不可靠的,因为该文件可能存在并且仍然无法访问。
一个想法是添加一些perl代码以在命令行中的所有文件之间执行,但我找不到。END
执行一次,如果最后一个文件成功,那么它不会知道以前的文件失败了。
touch aaa.txt
chmod 000 aaa.txt
perl -i -pe 'BEGIN { -f $ARGV[0] or die "fatal: " . $!; }' aaa.txt; echo $?
_
Can't open aaa.txt: Permission denied.
0
Can't open ...
文本是一个警告。您可以使用$SIG{__WARN__}
信号处理程序捕获它。
由于您应该收到的唯一警告来自-p
开关提供的循环中的隐式<>
运算符,因此您可以像这样重写代码
perl -i -pe 'BEGIN { $exit = 0; $SIG{__WARN__} = sub { $exit = 1; warn @_} } END { $? = $exit}' aaa.txt; echo $?
这会在脚本开始时将$exit
设置为 0,如果出现警告,则将其设置为 1。END
块将$exit
的值分配给$?
该值在脚本结束后将成为脚本的退出代码。