我有一个脚本,该脚本使用从SO上的Q&A采取的以下方法将文件名解析为数组:
unset ARGS
ARGID="1"
while IFS= read -r -d $'\0' FILE; do
ARGS[ARGID++]="$FILE"
done < <(find "$@" -type f -name '*.txt' -print0)
这很好用,可以完美处理所有类型的文件名变体。但是,有时我会将不存在的文件传递给脚本,例如:
$ findscript.sh existingfolder nonexistingfolder
find: `nonexistingfile': No such file or directory
...
通常情况下,我会让脚本用类似的方式捕获退出代码,RET=$?
然后使用它来决定如何继续。这似乎不适用于上面的流程替换。
在这种情况下正确的程序是什么?如何捕获返回码?还有其他更合适的方法来确定替换过程中是否出了问题吗?
您可以通过在标准外壳程序上回显它的返回结果,很容易地从任何带壳的进程中获得返回结果。流程替换也是如此:
while IFS= read -r -d $'\0' FILE ||
! return=$FILE
do ARGS[ARGID++]="$FILE"
done < <(find . -type f -print0; printf "$?")
如果我执行该命令,那么最后一行- (或者\0
视情况而定的分隔部分)将是find
返回状态。read
当它获得EOF时将返回1-因此唯一的时间$return
设置为$FILE
读入信息的最后一位。
我过去printf
避免添加额外的\n
ewline,这很重要,因为即使read
定期执行(其中不限制\0
NUL的行为),在刚读入的数据未以结尾的情况下,也将返回0以外的值。一条\n
腰线。因此,如果最后一行不是以\n
ewline结尾,则读入变量中的最后一个值将是您的返回值。
在上面运行命令,然后:
echo "$return"
0
如果我更改流程替换部分...
...
done < <(! find . -type f -print0; printf "$?")
echo "$return"
1
一个更简单的演示:
printf \\n%s list of lines printed to pipe |
while read v || ! echo "$v"
do :; done
pipe
实际上,只要您希望返回的内容是您从流程替换(或以此方式从中读取的任何子壳流程)内最后写入stdout的内容,那么$FILE
当它返回时,它始终将是您想要的返回状态通过。因此,该|| ! return=...
部分不是严格必需的-仅用于演示概念。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句