测试用例:(使用非 root 用户,因为 root 会忽略 000 权限...)
#in a clean directory:
[ -f file_1 ] && chmod 600 file_? # for repeat tests...
for i in file_1 file_2 file_3; do
printf 'A\nB\n' > "$i"
# we need at least 1 char : awk/gawk silently skips empty files...
done
chmod 000 file_2
awk '(FNR==1) { print FILENAME }' file_?
# tried with : regular (old unixes) awk on AIX. and gawk on Linux.
# the fatal "permission denied" on file_2 stops [g]awk.
Run Code Online (Sandbox Code Playgroud)
有没有办法捕获该致命错误并继续处理下一个文件?
(否则我觉得这很令人担忧:对一堆文件使用 awk 并不能保证处理所有文件,因为如果其中任何一个文件不可读,它将致命地退出)
如果可以的话请:回答
与 GAWK 一起:
\ngawk \'BEGINFILE { if (ERRNO) nextfile } (FNR==1) { print FILENAME }\' file_?\nRun Code Online (Sandbox Code Playgroud)\n在BEGINFILE块中,ERRNO如果文件打开成功,则为空nextfile,可用于跳到下一个并避免因错误而退出。
我不认为\xe2\x80\x99t 认为 AWK 的其他实现支持这一点。
\n可移植的是,您可以迭代所有参数,检查它们是否指向不可读的文件,如果是,则在 AWK 开始处理它们之前将它们从参数中删除;GAWK 手册有一个示例实现。然而,这是很危险的,因为使用此循环检查的文件可能在 AWK 开始处理它之前变得不可读(反之亦然)。
\n