使用流程替换时,如何捕获退出代码/正确处理错误?

谷氨酸

我有一个脚本,该脚本使用从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避免添加额外的\newline,这很重要,因为即使read定期执行(其中不限制\0NUL的行为),在刚读入的数据未以结尾的情况下,也将返回0以外的值。一条\n腰线。因此,如果最后一行不是以\newline结尾,则读入变量中的最后一个值将是您的返回值。

在上面运行命令,然后:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Kotlin中使用HTTP客户端时如何正确处理错误?

来自分类Dev

使用StreamContent时如何正确处理流

来自分类Dev

如何正确处理请求承诺错误?

来自分类Dev

如何正确处理python错误

来自分类Dev

Firebase函数如何正确处理错误

来自分类Dev

bash脚本编写-如何正确处理或捕获失败的数据库连接错误

来自分类Dev

子代失败时如何处理错误的退出代码

来自分类Dev

使用批处理更新项目 - 如何正确处理错误和成功?

来自分类Dev

连接到RESTful API时如何正确处理can-connect错误

来自分类Dev

Python,解析JSON对象时正确处理关键错误

来自分类Dev

如何正确处理pinvoke /非托管代码

来自分类Dev

如何正确处理pinvoke /非托管代码

来自分类Dev

使用进程替换声明变量时,是否可以捕获子shell的退出代码?

来自分类Dev

如何使用Promise正确处理express.js中的错误(字符串或对象)

来自分类Dev

如何在 MVVM 中使用 RxSwift 正确处理来自 api 请求的错误?

来自分类Dev

使用角度Google地图时如何正确处理标记点击事件?

来自分类Dev

如何正确处理Hystrix后备广告中的预期错误?

来自分类Dev

如何正确处理服务器端错误?

来自分类Dev

如何在Laravel中正确处理错误?

来自分类Dev

如何正确处理多个运行时错误?

来自分类Dev

如何正确处理 VBA 中的 FollowHyperlink 错误?

来自分类Dev

如何确保此函数正确处理错误?

来自分类Dev

从Roslyn工作区发出时如何正确处理资源?

来自分类Dev

关闭控制台时如何正确处理SIGBREAK?

来自分类Dev

使用 poll() 时正确处理 Ctrl-C

来自分类Dev

如何正确处理httpClient?

来自分类Dev

如何正确处理scanf()

来自分类Dev

如何正确处理并发?

来自分类Dev

如何正确处理导航

Related 相关文章

  1. 1

    在Kotlin中使用HTTP客户端时如何正确处理错误?

  2. 2

    使用StreamContent时如何正确处理流

  3. 3

    如何正确处理请求承诺错误?

  4. 4

    如何正确处理python错误

  5. 5

    Firebase函数如何正确处理错误

  6. 6

    bash脚本编写-如何正确处理或捕获失败的数据库连接错误

  7. 7

    子代失败时如何处理错误的退出代码

  8. 8

    使用批处理更新项目 - 如何正确处理错误和成功?

  9. 9

    连接到RESTful API时如何正确处理can-connect错误

  10. 10

    Python,解析JSON对象时正确处理关键错误

  11. 11

    如何正确处理pinvoke /非托管代码

  12. 12

    如何正确处理pinvoke /非托管代码

  13. 13

    使用进程替换声明变量时,是否可以捕获子shell的退出代码?

  14. 14

    如何使用Promise正确处理express.js中的错误(字符串或对象)

  15. 15

    如何在 MVVM 中使用 RxSwift 正确处理来自 api 请求的错误?

  16. 16

    使用角度Google地图时如何正确处理标记点击事件?

  17. 17

    如何正确处理Hystrix后备广告中的预期错误?

  18. 18

    如何正确处理服务器端错误?

  19. 19

    如何在Laravel中正确处理错误?

  20. 20

    如何正确处理多个运行时错误?

  21. 21

    如何正确处理 VBA 中的 FollowHyperlink 错误?

  22. 22

    如何确保此函数正确处理错误?

  23. 23

    从Roslyn工作区发出时如何正确处理资源?

  24. 24

    关闭控制台时如何正确处理SIGBREAK?

  25. 25

    使用 poll() 时正确处理 Ctrl-C

  26. 26

    如何正确处理httpClient?

  27. 27

    如何正确处理scanf()

  28. 28

    如何正确处理并发?

  29. 29

    如何正确处理导航

热门标签

归档